【问题标题】:How to Get Tapped Item from Tapped Event in StackPanel如何从 StackPanel 中的 Taped 事件中获取 Taped 项目
【发布时间】:2013-12-17 14:12:11
【问题描述】:

我在应用程序页面中有一个 ListPicker,但在页面加载时会多次调用 SelectionChanged 事件。为了避免这种情况,我一直在关注我在这里问过的上一个问题ListPicker SelectionChanged Event Called Multiple Times During Navigation,其中建议不是让 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 事件留在代码后面,我也没有看到在页面加载/导航到时调用了两次该事件,但我不确定如何获取当前选择的现在有项目吗?

EDIT2**

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

        }
    }

【问题讨论】:

  • 好吧,您可能还会通过点击事件获得值 SelectedIndex。

标签: c# xaml windows-phone-7 windows-phone-8 listpicker


【解决方案1】:

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

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 事件 对于上述问题,如果我猜对了,您在 OnNavigatedTo 事件上设置了 listpicker 的 itemssource。所以用

修改你的 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;
   }

【讨论】:

  • 好的,我一定会试试的。问题是,我有 MainPage,然后 ThemeListPicker 位于 MainPage 的 NavigatedTo 的 SettingsPage 上。那么设置e.NavigationMode != NavigationMode.Back 是否适用?当 SettingsPage 为 NavigateTo 时,如何设置该语句以防止 `ThemeListPicker_SelectionChanged 触发两次?另外,另一种选择是在 SettingsPage Loaded 事件中设置 ThemeListPicker 的 ItemsSource 吗?
  • @Matthew 每当您设置 ThemeListPicker 的项目来源时,selectionchanged 事件就会触发。没有办法限制它。所以我建议你在任何其他事件上做你的工作并删除 selectionchanged 事件
  • 好的。如上面我的编辑所示,我已删除 ThemeListPicker_SelectionChanged 事件。我正在考虑使用 StackPanel Tap 事件来获取 ListPicker 中当前选定的项目。我的问题就是这样,我如何从 StackPanel Tap 事件中获取 ThemeListPicker 中当前选定的项目?
  • @Matthew 编辑 ans 请看看它对我有用
  • 出于某种原因,在我的 Edit2 中我添加了 var selectedItem1 = (sender as StackPanel).DataContext as ListPicker; selectedItem1 = null 尽管在调试时将光标放在 DataContext 上时,我可以看到 ListPicker 的当前项?
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多