none
对“如何在pivot程序中让longlistselector中的每一个“设计”均跳转到不同的页面?”帖子的追问,发生新问题。 RRS feed

  • 问题

  • 您好,之前通过shao.peng的帮助程序能够实现让longlistselector中的每一个“设计”均跳转到不同的页面。但是在调试的过程中,比如“runtime one”导航到了Page1,这时按WP的返回键,回到mainpage后,再次点击runtime one,runtime one不会发生跳转。此时无论点击多少次跳转都不会发生。但是点击runtime two时可以跳转,按返回后runtime two也会出现同样的问题,就是跳转失效。请问如何解决?谢谢!
    2014年7月17日 13:05

答案

  • 也许你使用的时SelectionChanged事件,第二次点击同样的项将不会激发此事件,你可以在ListItem上面使用Tap事件试一下
    2014年7月18日 0:57

全部回复

  • 也许你使用的时SelectionChanged事件,第二次点击同样的项将不会激发此事件,你可以在ListItem上面使用Tap事件试一下
    2014年7月18日 0:57
  • 你好。

    接着上次那个问题,跳转后回退到源页面,再次点击无效是因为两次点击同一个Item,所以SelectedItem没有变化,没有触发SelectionChanged事件。解决办法就是在点击跳转的时候,把SelectedItem重置,我直接在上一个问题的代码里添加了(添加的代码为最后一行):

    private void lls_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var lineOne = (lls.SelectedItem as ItemViewModel).LineOne;
        string pageName = string.Empty;
        switch (lineone)
        {
            case "runtime one":
                pageName = "Page1";
                break;
                // 这里一次判断LineOne的其他取值
                ...
    
            default:
                pageName = "PageDefault";
                break;
        }
        NavigationService.Navigate(new Uri(string.Format("/{0}.xaml", pageName), UriKind.RelativeOrAbsolute));
        // 将SelectedItem重置为null,即不选中任何Item
        lls.SelectedItem = null;
    }




    • 已编辑 shao.meng 2014年7月18日 2:38 修改代码
    • 已建议为答案 shao.meng 2014年7月21日 3:27
    2014年7月18日 1:01
  • 将selectionchanged改为Tap就好喽~~
    2014年7月18日 2:37
  • 你好。

    不好意思,我勿用ListBox做示例了。LonglistSelector本身没有SelectedIndex属性,只有SelectedItem。修改后的代码见我上方修改后的答案。

    2014年7月18日 2:40
  • 谢谢您呀,您知道WP8中动画激活得条件吧?

    通过blend,在程序中使用storyboard创建了两段段动画,想要设定手机屏幕的一个位置:当我的双手在这个位置做缩放动作时,此动画激活并播放;当我单指在同样的位置滑动时会激发另一段动画。

    运行环境:.net 4.5,VS2012,WP8.0 SDK。storyboard的触发器貌似没有能满足我的要求的。。。请问还有什么办法能够实现?

    请您指教吧....我挺着急的,上哪也找不到相关度的资料,您能帮我看看吗?谢了!

    2014年7月18日 4:37
  • 这种情况使用触发器可能不太适合了。

    可以去监听手势动作,当监听到缩放比例变化(即双指滑动缩放)时,使用C#代码对StoryBoard做Begin()动作;当监听不到缩放比例时,我们认为它是滑动,这时候对另一个动画执行Begin()动作。

    2014年7月18日 5:06
  • 谢谢!您有相关的示例或者资料吗,给个链接或者示例啥的,谢谢啦!
    2014年7月18日 5:45
    • 已建议为答案 shao.meng 2014年7月21日 3:28
    2014年7月18日 6:02
  • 您看这个,举个例子现在这个图现在可以向右移动(一段动画),我想设定当我用手在图像上做缩放动作时,触发这段动画。怎么监听呢?又如何开始执行动画呢?
    2014年7月18日 6:30
  • 你好。
    我大致说一下手势操作的处理过程吧。

    ManipulationStarted 是触控开始
    ManipulationDelta 是触控过程,会产生一个DeltaManipulation,包含两个重要属性:Translation 和 Scale,分别标记平移和缩放。
    ManipulationCompleted 是触控完成。

    结合你的程序,应该在ManipulationDelta上做处理,先判断Scale,如果是缩放,就去对控件做缩放的RenderTransform。如果是平移,就去做平移的RenderTransform。

    2014年7月18日 6:40
  • 嗯....比如我在Page1.xaml中插入了一张图片代码如下

    			<Image x:Name="image" Margin="83,129,73,183" Source="123.jpg" Stretch="Fill" RenderTransformOrigin="0.5,0.5">
    				<Image.RenderTransform>
    					<CompositeTransform/>
    				</Image.RenderTransform>
    			</Image>

    然后在Page1.xaml中定义了动画

    		<Storyboard x:Name="Storyboard1">
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="image">
    				<EasingDoubleKeyFrame KeyTime="0" Value="0.712"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.39"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.356"/>
    			</DoubleAnimationUsingKeyFrames>
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="image">
    				<EasingDoubleKeyFrame KeyTime="0" Value="42.5"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:1" Value="-90"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:2" Value="-365"/>
    			</DoubleAnimationUsingKeyFrames>
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="image">
    				<EasingDoubleKeyFrame KeyTime="0" Value="0.683"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.383"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.35"/>
    			</DoubleAnimationUsingKeyFrames>
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="image">
    				<EasingDoubleKeyFrame KeyTime="0" Value="47.5"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:1" Value="122.5"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:2" Value="42.5"/>
    			</DoubleAnimationUsingKeyFrames>
    		</Storyboard>

    然后是应该在page1.xaml.cs中插入ManipulationStarted事件,,,关联到storyboard1动画?这个怎么添加让它播放storyboard1呢?

    再接下来的DeltaManipulation的平移缩放这个怎么标记呀...我不知道怎么写这个程序,,,有点懵....没写过这个。

    最后是ManipulationCompleted事件。。。说白了我整个都不知道怎么写,,,看了看MSDN的官方文档啥的还是不懂,,,(我没有C#编程基础)。。困扰,能不能请您再帮帮我,,怎么弄这个平移缩放触发。谢谢了。

    2014年7月18日 11:53
  • 好的。

    我根据你的疑问,使用你的代码,做了一个小示例:

    大致思路是监听Image控件的ManipulationDelta事件,然后根据e.DeltaManipulation.Scale的值,来决定哪一个Storyboard被执行。

    XAML:

    <Grid x:Name="LayoutRoot">
        <Image x:Name="image" Source="Assets/AlignmentGrid.png"
                   ManipulationDelta="image_ManipulationDelta">
            <Image.RenderTransform>
                <CompositeTransform/>
            </Image.RenderTransform>
        </Image>
    </Grid>

    Storyboard的定义,我把你的Storyboard1分为两部分,缩放和平移分开了:

        <phone:PhoneApplicationPage.Resources>
            <Storyboard x:Name="Storyboard1">
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="0.712"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.39"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.356"/>
                </DoubleAnimationUsingKeyFrames>
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="0.683"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.383"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.35"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Name="Storyboard2">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="42.5"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-90"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:2" Value="-365"/>
                </DoubleAnimationUsingKeyFrames>
    
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="47.5"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:1" Value="122.5"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:2" Value="42.5"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </phone:PhoneApplicationPage.Resources>

    然后就是C#代码:

            private void image_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
            {
                if (e.DeltaManipulation.Scale.X != 0 && e.DeltaManipulation.Scale.Y != 0)
                {
                    Storyboard1.Begin();
                }
                else
                {
                    Storyboard2.Begin();
                }
            }

    • 已建议为答案 shao.meng 2014年7月21日 3:28
    • 已标记为答案 (C)sharp.sq 2014年7月21日 6:58
    • 取消答案标记 (C)sharp.sq 2014年7月22日 1:56
    2014年7月18日 12:44
  • 其实你描述的思路大致就是程序实现的思路了。

    当“2”发生触控动作,也就是ManipulationDelta时,去判断是缩放还是平移,就像我前面代码那样做。

    如果是平移,那么1的动画Begin();

    如果是缩放,那么2的动画Begin();

    2014年7月21日 1:26
  • 谢谢,那“1”的动画如何让他隐藏呢?在播放的时候再显示出来?是应该在storyboard录制的时候第一贞取消掉吗?
    2014年7月21日 2:15
  • 可以在播放2的动画时,控制1的Visibility,让它隐藏。
    2014年7月21日 2:42
  • 那么我的动画“1”如果是一连串的图片连成的呢?比如40张图连续播放形成的动画,如何让“1”先隐藏,然后在播放的时候显示?
    2014年7月21日 3:14
  • 这样吧,这样一条条回复描述下来,太零碎了。你可以新开一个问题,把这个问题完结了。然后完整描述一下你的问题,一方面便于梳理思路,让问题更容易解决,另一方面也便于我和更多的人可以帮助到你,谢谢。

    2014年7月21日 3:20
  • 如果这两种情况改成3种情况(有3段storyboard),第一段显示,2.3段隐藏,当我在第一段屏幕左侧的中间位置手指平移时,第一段动画触发;当我在同样的位置时,缩放动画触发,当我在屏幕右侧靠上部分单指滑动时,3段动画触发。请问这个的XAML和C#代码怎么写?
    2014年7月22日 1:59