如何停止枢轴循环

时间:2011-10-06 01:38:00

标签: windows-phone-7

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

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

我尝试过设置e.Handled = True但是没有用。

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

有什么想法吗?

干杯

史蒂夫

6 个答案:

答案 0 :(得分:5)

数据透视图并非设计用作向导,并且不支持停止其循环行为,因为这会为用户创建不一致的用户体验。

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

答案 1 :(得分:3)

不要使用Pivot作为向导。改为创建自己的过渡。

答案 2 :(得分:2)

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

这是我被忽视的博客中的最​​后一个条目,应该为使用透视样式滑动创建向导提供良好的基础。

Calum。

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

答案 3 :(得分:1)

它只是我已经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可从该版本的OS获得。

答案 4 :(得分:0)

如果你绝对想让Pivot不再循环,那么这是一个快速而又肮脏的黑客攻击:

 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。不是很漂亮但是很有效。

答案 5 :(得分:0)

这很奇怪,因为它只适用于模拟器。我想你不会弄乱UI

您可以使用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();
    }