C# 如何从StackPanel中的Tapped事件获取Tapped项
我在应用程序页面中有一个ListPicker,但SelectionChanged事件在页面加载时会被多次调用。为了避免这种情况,我一直遵循我在这里提出的前一个问题,其中的建议是,不要让Elistpicker_Selection更改在datatemplate中创建父stackpanel…,在stackpanel中创建一个名为stk_tap的tap事件,并“使用此tap stk_tap执行您的操作,如下所示,”,此事件也会在每次调用选择更改时被调用,但它不会表现出与选择更改事件类似的错误行为 现在我已经相应地调整了我的解决方案,但我不知道如何确定ListPicker的哪个项目正在被选中或当前被选中。此外,我还删除了ListPicker中的ListPicker SelectionChanged事件,因为我认为StackPanel可以获取该项目,但我不确定这是否正确,或者如何实现 XAML *编辑:我如何更新我的解决方案C# 如何从StackPanel中的Tapped事件获取Tapped项,c#,xaml,windows-phone-7,windows-phone-8,listpicker,C#,Xaml,Windows Phone 7,Windows Phone 8,Listpicker,我在应用程序页面中有一个ListPicker,但SelectionChanged事件在页面加载时会被多次调用。为了避免这种情况,我一直遵循我在这里提出的前一个问题,其中的建议是,不要让Elistpicker_Selection更改在datatemplate中创建父stackpanel…,在stackpanel中创建一个名为stk_tap的tap事件,并“使用此tap stk_tap执行您的操作,如下所示,”,此事件也会在每次调用选择更改时被调用,但它不会表现出与选择更改事件类似的错误行为 现在我
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="PickerItemTemplate">
<StackPanel tap="stk_Tap">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme"
ItemTemplate="{StaticResource PickerItemTemplate}"
/>
因此,即使在修改后我将ListPicker SelectionChanged事件留在代码中,我也没有看到在加载/导航到页面时调用两次该事件,但我不确定现在如何获取当前选定的项目
编辑2**
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
themeList = new List<TestApp.Common.Theme>();
themeList.Add(new TestApp.Common.Theme() { Name = "Darker", name = "dark" });
themeList.Add(new TestApp.Common.Theme() { Name = "Lighter", name = "light" });
ThemeListPicker.ItemsSource = themeList;
}
private void stk_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (ThemeListPicker.SelectedIndex != -1)
{
//Need to get the current ThemeListPicker's 'name'
var selectedItem1 = (sender as StackPanel).DataContext as ListPicker;
//use selectedItem1
}
}
这种工作不需要额外的抽头活动
private void ThemeListPicker_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if(ThemeListPicker.SelectedIndex==-1)
return;
var theme = (sender as ListPicker).SelectedItem;
if (index == 0)
{
Settings.LightTheme.Value = true;
MessageBox.Show("light");
}
else
{
Settings.LightTheme.Value = false;
MessageBox.Show("dark");
}
ThemeListPicker.SelectedIndex=-1
}
ListPicker SelectionChanged事件在导航期间多次调用
对于上面的问题,若我猜对了,您可以将listpicker的itemssource设置为on NavigatedTo事件。因此,请使用修改导航到方法
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.NavigationMode != NavigationMode.Back)
{
// Your code goes here
}
}
//堆栈面板点击事件
private void stack_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
var selectedIrem = (Cast as your type)(sender as StackPanel).DataContext;
}
嗯,您可能还通过点击事件获得SelectedIndex的值。好的,我一定会试试这个。问题是,我有一个主页,然后Themesticker在一个设置页面上,该设置页面从主页导航到。设置e.NavigationMode也是如此!=导航模式。返回是否适用?当SettingsPage被导航到时,设置该语句将如何防止“Themelisticker_selection”更改为两次触发?另外,另一个选项是只在SettingsPage Loaded事件中设置Elistpicker的ItemsSource吗?@Matthew无论何时设置Elistpicker的item source,selectionchanged事件都会触发。没有办法限制它。因此,我建议您对任何其他事件进行处理,并删除selectionchanged eventOk。我已经删除了Themelisticker_SelectionChanged事件,如上面的编辑所示。我想使用StackPanel Tap事件来获取ListPicker中当前选定的项目。我的问题是,如何从StackPanel Tap事件中获取ThemeListPicker中当前选定的项目?@Matthew edit ans请看一看,出于某种原因,在我的Edit2中,我添加了var selectedItem1=sender作为StackPanel.DataContext作为ListPicker;selectedItem1=null,尽管在调试时将光标放在DataContext上时,我可以看到ListPicker的当前项?
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.NavigationMode != NavigationMode.Back)
{
// Your code goes here
}
}
private void stack_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
var selectedIrem = (Cast as your type)(sender as StackPanel).DataContext;
}