C# 轴控件显示一个轴,但在另一个轴中注册点击

C# 轴控件显示一个轴,但在另一个轴中注册点击,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我有一个todolist应用程序,它在一个Pivot控件中的单独PivotItems内有几个ListBox控件。如果我导航到另一个页面,并使用“后退”按钮返回,则显示的Pivot没有响应。但是,其上的活动(滚动、点击等)似乎会影响下一个轴,即所选的索引+1 这听起来很像Pivot控件中的一个bug,但也许我做错了什么?这是我的pivot控件的代码 [code updated, see below] 我不认为我导航到的页面的代码是重要的,因为行为发生在后退按钮上 其他一些重要信息: 在第一个数

我有一个todolist应用程序,它在一个
Pivot
控件中的单独
PivotItems
内有几个
ListBox
控件。如果我导航到另一个页面,并使用“后退”按钮返回,则显示的
Pivot
没有响应。但是,其上的活动(滚动、点击等)似乎会影响下一个
,即所选的索引+1

这听起来很像
Pivot
控件中的一个bug,但也许我做错了什么?这是我的pivot控件的代码

[code updated, see below]
我不认为我导航到的页面的代码是重要的,因为行为发生在后退按钮上

其他一些重要信息:

  • 在第一个
    数据透视项
    (索引0)上,不会发生错误
  • 在最后一个
    数据透视项
    发生了另一个问题。离开最后一个列表并通过“后退”按钮返回,将显示一个空列表
  • 在所有情况下,问题都是通过向左或向右滑动列表,然后返回来解决的
编辑:

我错了,页面代码不重要。我使用的是
OnNavigatedTo
方法,而不是
MainPage
方法。Romasz提供了一个工作完美的样本。我通过改变三个部分来匹配我自己的非工作代码来打破它

  • 将页面设置为继承自
    INotifyPropertyChanged
    (正如我使用
    NotifyPropertyChanged
  • 将数据绑定代码移动到
    OnNavigatedTo
    方法
  • 在代码隐藏中设置
    PivotControl
    ItemsSource
  • 进行了这三项更改后,示例将无法运行。这是密码

    MainPage.xaml

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid x:Name="ContentPanel" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="9*"/>
            </Grid.RowDefinitions>
            <Button x:Name="myButton" VerticalAlignment="Top" 
                 Content="Go to different Page!" Grid.Row="0"/>
            <controls:Pivot x:Name="PivotControl" Grid.Row="1" 
                 ItemsSource="{Binding Lists}">
                <controls:Pivot.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"/>
                    </DataTemplate>
                </controls:Pivot.HeaderTemplate>
                <controls:Pivot.ItemTemplate>
                    <DataTemplate>
                        <ListBox ItemsSource="{Binding Items}" 
                HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" 
                Margin="24,0,0,0" Height="Auto" VerticalAlignment="Stretch">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <CheckBox></CheckBox>
                                        <TextBlock Text="{Binding Title}"/>
                                    </StackPanel>                                    
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </DataTemplate>
                </controls:Pivot.ItemTemplate>
            </controls:Pivot>
        </Grid>
    </Grid>
    
    
    
    MainPage.xaml.cs

    public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged
    {
        public class myItems
        {
            public string Title { get; set; }
        }
    
        public class myList
        {
            public string Name { get; set; }
            private List<myItems> items = new List<myItems>();
            public List<myItems> Items
            {
                get { return items; }
                set { items = value; }
            }
        }
    
        private ObservableCollection<myList> _Lists;
        public ObservableCollection<myList> Lists
        {
            get
            {
                return _Lists;
            }
            set
            {
                if (_Lists != value)
                {
                    _Lists = value;
                    NotifyPropertyChanged("Lists");
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
    
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
    
            Lists = new ObservableCollection<myList>();
    
            myList list1 = new myList() { Name = "First" };
            for (int i = 0; i < 100; i++)
                list1.Items.Add(new myItems() { Title = (i + 1).ToString() });
    
            myList list2 = new myList() { Name = "Second" };
            for (int i = 100; i < 200; i++)
                list2.Items.Add(new myItems() { Title = (i + 1).ToString() });
    
            myList list3 = new myList() { Name = "Third" };
            for (int i = 200; i < 300; i++)
                list3.Items.Add(new myItems() { Title = (i + 1).ToString() });
    
            myList list4 = new myList() { Name = "Fourth" };
            for (int i = 300; i < 400; i++)
                list4.Items.Add(new myItems() { Title = (i + 1).ToString() });
    
            Lists.Add(list1);
            Lists.Add(list2);
            Lists.Add(list3);
            Lists.Add(list4);
    
            myButton.Click += first_Click;
            this.DataContext = this;
    
        }
    
        private void first_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.RelativeOrAbsolute));
        }
    }
    
    公共部分类主页面:PhoneApplicationPage,INotifyPropertyChanged
    {
    公共类myItems
    {
    公共字符串标题{get;set;}
    }
    公共类myList
    {
    公共字符串名称{get;set;}
    私有列表项=新列表();
    公共清单项目
    {
    获取{返回项;}
    设置{items=value;}
    }
    }
    私有可观察收集列表;
    公共可观测收集列表
    {
    得到
    {
    返回列表;
    }
    设置
    {
    如果(_list!=值)
    {
    _列表=值;
    NotifyPropertyChanged(“列表”);
    }
    }
    }
    公共事件属性更改事件处理程序属性更改;
    私有void NotifyPropertyChanged(字符串propertyName)
    {
    if(PropertyChanged!=null)
    {
    PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
    }
    }
    //建造师
    公共主页()
    {
    初始化组件();
    }
    受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
    {
    基地。导航到(e);
    Lists=新的ObservableCollection();
    myList list1=新建myList(){Name=“First”};
    对于(int i=0;i<100;i++)
    list1.Items.Add(newmyitems(){Title=(i+1.ToString()});
    myList list2=新建myList(){Name=“Second”};
    对于(int i=100;i<200;i++)
    list2.Items.Add(newmyitems(){Title=(i+1.ToString()});
    myList list3=新建myList(){Name=“Third”};
    对于(int i=200;i<300;i++)
    list3.Items.Add(newmyitems(){Title=(i+1.ToString()});
    myList list4=新的myList(){Name=“Fourth”};
    对于(int i=300;i<400;i++)
    list4.Items.Add(newmyitems(){Title=(i+1.ToString()});
    列表。添加(列表1);
    列表。添加(列表2);
    列表。添加(列表3);
    列表。添加(列表4);
    我的按钮。单击+=第一次单击;
    this.DataContext=this;
    }
    私有无效第一次单击(对象发送者,路由目标e)
    {
    NavigationService.Navigate(新Uri(“/Page1.xaml”,UriKind.RelativeOrAbsolute));
    }
    }
    
    完整项目:

    这段代码与我所经历的问题非常相似。如果移动到第二个或第三个列表,请单击“转到另一页”按钮,然后单击“上一步”按钮,枢轴将移动到“第一个”列表并显示为空。来回导航将重置列表

    如果我更改了三个差异中的任何一个-删除
    INotifyPropertyChanged
    的继承性,将绑定代码移动到主页面或在codebehind中设置
    ItemsSource
    ,应用程序将按预期再次工作。这已经成为一个学术问题(因为没有更好的术语),因为它不再影响我的应用程序,但我仍然不知道为什么这三个因素结合在一起会导致奇怪的
    PivotControl
    行为


    为了重新迭代,更改上述任何一个因素都可以消除该问题——那么是什么导致了它呢

    根据你的描述,我建立了。有一个包含4个项目的轴,每个项目中都有一个包含texblocks的列表。枢轴上方有一个按钮,可导航到下一页。

    我已经在上面测试过这样的情况:

    • 在第一个数据透视项中向下滚动列表,选择项目,导航到第页,返回=>数据透视和列表响应
    • 已将数据透视项更改为第二个数据透视项
      while (Lists.Count > 1)
         Lists.RemoveAt(1);
      // add new items
      Lists.RemoveAt(0); // watch out for the first run of OnNavigatedTo - there is a need here for if statement or something
      
          bool IsDataLoaded = false; //flag
      
          public MainPage()
          {
              InitializeComponent();
      
          }
          protected override void OnNavigatedTo(NavigationEventArgs e)
          {
      
              base.OnNavigatedTo(e);
      
              if (!IsDataLoaded)
              {
                  Lists = new ObservableCollection<myList>();
      
                  myList list1 = new myList() { Name = "First" };
                  for (int i = 0; i < 100; i++)
                      list1.Items.Add(new myItems() { Title = (i + 1).ToString() });
      
                  myList list2 = new myList() { Name = "Second" };
                  for (int i = 100; i < 200; i++)
                      list2.Items.Add(new myItems() { Title = (i + 1).ToString() });
      
                  myList list3 = new myList() { Name = "Third" };
                  for (int i = 200; i < 300; i++)
                      list3.Items.Add(new myItems() { Title = (i + 1).ToString() });
      
                  myList list4 = new myList() { Name = "Fourth" };
                  for (int i = 300; i < 400; i++)
                      list4.Items.Add(new myItems() { Title = (i + 1).ToString() });
      
                  Lists.Add(list1);
                  Lists.Add(list2);
                  Lists.Add(list3);
                  Lists.Add(list4);
      
                  myButton.Click += first_Click;
                  this.DataContext = this;
                  IsDataLoaded = true;
              }
      
          }