【问题标题】:How to stop pivot looping如何停止枢轴循环
【发布时间】:2015-01-09 00:02:18
【问题描述】:

我想从枢轴控件创建一个向导控件。为此,我需要停止枢轴循环。我想停止枢轴控件从最后一项向前移动到第一项,从第一项向后移动到最后一项。

我很确定我应该能够拦截操作,例如如果我检测到对最后一个枢轴项的从右到左的操作,则取消。我可以在 ManipulationDelta 中捕捉到这一点,但不知道如何取消操作。

我尝试设置 e.Handled = True 但没有成功。

我尝试将 IsHitTestVisisble 设置为 false,但这会杀死所有操作。我尝试在 ManipulationCompleted 中将其设置回 true ,但这允许所有操作。

有什么想法吗?

干杯

史蒂夫

【问题讨论】:

  • 您的目标是芒果吗?您可以使用 Toolkit 中的 Lockable Pivot。

标签: windows-phone-7


【解决方案1】:

枢轴并非设计为用作向导,也不支持停止其循环行为,因为这会为用户创建不一致的用户体验。

如果您真的必须创建一个向导,请使用多个页面。

【讨论】:

  • 我创建了自己的向导控件,使用水平放置的堆栈面板和从一个“页面”移动到下一个“页面”的过渡。它工作得很好。唯一让它失望的是滑动不像枢轴那样“触觉”,即它不会随着滑动而移动。相反,它需要在移动之前完成滑动。令我震惊的是,我基本上重新发明了枢轴,如果我能阻止它循环,我可以重新使用枢轴。我大部分时间都在那里,但只需要最后一点的帮助。
【解决方案2】:

不要将 Pivot 用作向导。而是创建自己的过渡。

【讨论】:

    【解决方案3】:

    我无法回复您对 Matts 答案的评论,但我只是想向您指出这一点: http://forty3degrees.wordpress.com/2011/07/19/creating-a-swipable-contentcontrol/

    这是我非常被忽视的博客中的最​​后一篇文章,应该为使用枢轴样式滑动创建向导提供良好的基础。

    卡鲁姆。

    编辑:我试图用枢轴做你想做的事,但找不到阻止它循环的方法。我能想到的唯一方法是从 Pivot 派生一个自定义控件。不幸的是 SelectedIndex/SelectedItem 不是虚拟的,因此您需要隐藏它们(使用 new 修饰符)并从基类重现逻辑。

    【讨论】:

    • 感谢卡鲁姆。我已将此标记为答案,因为您最接近建议一种实现我正在尝试做的事情的方法。
    【解决方案4】:

    这只是我posted here 的替代解决方案 - 你可以尝试使用 XNA 框架 TouchPanelTouch.FrameReported Event

    using Microsoft.Xna.Framework.Input;
    
    public MainPage()
    {
       InitializeComponent();
       myPivot.IsHitTestVisible = false; // disable your Pivot
       Touch.FrameReported += Touch_FrameReported;
       TouchPanel.EnabledGestures = GestureType.HorizontalDrag; 
    }
    
    TouchPoint first;
    
    private void Touch_FrameReported(object sender, TouchFrameEventArgs e)
    {
        TouchPoint mainTouch = e.GetPrimaryTouchPoint(this);
        if (mainTouch.Action == TouchAction.Down)
            first = mainTouch;
        else if (mainTouch.Action == TouchAction.Up && TouchPanel.IsGestureAvailable)
        {
            if (mainTouch.Position.X < first.Position.X)
            {
                if (myPivot.SelectedIndex < myPivot.Items.Count - 1)
                    myPivot.SelectedIndex++;
            }
            else if (mainTouch.Position.X > first.Position.X)
            {
                if (myPivot.SelectedIndex > 0)
                    myPivot.SelectedIndex--;
            }
        }
    }
    

    认为它可能适用于 WP7.1,因为 TouchPanel 可从该版本的操作系统中使用。

    【讨论】:

      【解决方案5】:

      如果您绝对想让 Pivot 不循环,这里有一个快速而肮脏的 hack:

       int previousSelectedIndex = 0;
      
          public PageWithPivot()
          {
              InitializeComponent();
              pivot.SelectionChanged += new SelectionChangedEventHandler(pivot_SelectionChanged); 
          }
      
      
          private void pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
      
              if (pivot.SelectedIndex == 0 && previousSelectedIndex == <number Of screens - 1>)
                  pivot.SelectedIndex = <number Of screens - 1>;
              previousSelectedIndex = pivot.SelectedIndex;
          }
      

      这会导致您的 PivotControl 跳回最后一个 pivotItem。不是很漂亮,但很有效。

      【讨论】:

      • stackoverflow ;) 异常和屏幕数是 pivot1.Items.Count
      【解决方案6】:

      这太奇怪了,因为它只能在模拟器中工作。我猜你不会弄乱用户界面

      你可以使用 MVVM:

      <phone:Pivot Foreground="Black"
                       Name="pivot1"
                       Title="AIDE"
                       SelectedIndex="{Binding SelectedItem, Mode=TwoWay}">
      

      Cs:

          private class HelpViewModel : ViewModelBase
          {
              public HelpViewModel()
              {
      
              }
      
              private int _SelectedItem = 0;
              public int SelectedItem
              {
                  get
                  {
                      return _SelectedItem;
                  }
                  set
                  {
                      if (_SelectedItem != value)
                      {
                          if (value == 3)
                              _SelectedItem = 0;
                          else
                              _SelectedItem = value;
                          RaisePropertyChanged(() => SelectedItem);
                      }
                  }
              }
          }
      
      
          public AppHelpPivot()
          {
              InitializeComponent();
              LayoutRoot.DataContext = new HelpViewModel();
          }
      

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 2015-12-14
        • 2013-06-20
        • 2022-01-11
        • 2014-05-30
        • 2010-09-26
        相关资源
        最近更新 更多