如何从 StackPanel 中的点击事件中获取点击项目
本文关键字:获取 项目 事件 StackPanel | 更新日期: 2024-10-31 03:26:38
我在应用程序页面中有一个 ListPicker,但在页面加载时多次调用 SelectionChanged 事件。为了避免这种情况,我一直在遵循我在这里提出的一个问题 ListPicker SelectionChanged 事件在导航期间多次调用,其中建议不是在数据模板内创建父堆栈面板ThemeListPicker_SelectionChanged而是在 StackPanel 中创建一个名为 stk_Tap
的点击事件,然后"使用此点击stk_Tap执行您的操作作为, 每次调用选择更改时也会调用此事件,但它不会像选择更改事件那样表现出错误行为。
现在我已经相应地调整了我的解决方案,但我不知道如何确定正在选择或当前选择了 ListPicker 的哪个项目。我还删除了ListPicker中的ListPicker SelectionChanged事件,因为我认为StackPanel可以获取该项目,但我不确定这是否正确或如何做到这一点?
XAML
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="PickerItemTemplate">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme"
ItemTemplate="{StaticResource PickerItemTemplate}"
SelectionChanged="ThemeListPicker_SelectionChanged"/>
XAML.CS
private void ThemeListPicker_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if(ThemeListPicker.SelectedIndex != -1)
{
var theme = (sender as ListPicker).SelectedItem;
if (index == 0)
{
Settings.LightTheme.Value = true;
MessageBox.Show("light");
}
else
{
Settings.LightTheme.Value = false;
MessageBox.Show("dark");
}
}
}
*编辑:我如何更新我的解决方案
<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
}
列表选取器选择更改事件在导航期间多次调用 对于上述问题,如果我猜对了,您将列表选择器的项目源设置为OnNavigatedTo事件。所以修改你在导航到方法与
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;
}