如何从 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
        }
    }

如何从 StackPanel 中的点击事件中获取点击项目

此类工作无需额外的点击事件。

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;
   }