C# 轴控件显示一个轴,但在另一个轴中注册点击
我有一个todolist应用程序,它在一个C# 轴控件显示一个轴,但在另一个轴中注册点击,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我有一个todolist应用程序,它在一个Pivot控件中的单独PivotItems内有几个ListBox控件。如果我导航到另一个页面,并使用“后退”按钮返回,则显示的Pivot没有响应。但是,其上的活动(滚动、点击等)似乎会影响下一个轴,即所选的索引+1 这听起来很像Pivot控件中的一个bug,但也许我做错了什么?这是我的pivot控件的代码 [code updated, see below] 我不认为我导航到的页面的代码是重要的,因为行为发生在后退按钮上 其他一些重要信息: 在第一个数
Pivot
控件中的单独PivotItems
内有几个ListBox
控件。如果我导航到另一个页面,并使用“后退”按钮返回,则显示的Pivot
没有响应。但是,其上的活动(滚动、点击等)似乎会影响下一个轴
,即所选的索引+1
这听起来很像Pivot
控件中的一个bug,但也许我做错了什么?这是我的pivot控件的代码
[code updated, see below]
我不认为我导航到的页面的代码是重要的,因为行为发生在后退按钮上
其他一些重要信息:
- 在第一个
(索引0)上,不会发生错误李>数据透视项
- 在最后一个
,发生了另一个问题。离开最后一个列表并通过“后退”按钮返回,将显示一个空列表李>数据透视项
- 在所有情况下,问题都是通过向左或向右滑动列表,然后返回来解决的李>
- 在最后一个
OnNavigatedTo
方法,而不是MainPage
方法。Romasz提供了一个工作完美的样本。我通过改变三个部分来匹配我自己的非工作代码来打破它
INotifyPropertyChanged
(正如我使用NotifyPropertyChanged
)OnNavigatedTo
方法PivotControl
的ItemsSource
<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; } }