C# 如何从StackPanel中的Tapped事件获取Tapped项

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执行您的操作,如下所示,”,此事件也会在每次调用选择更改时被调用,但它不会表现出与选择更改事件类似的错误行为 现在我

我在应用程序页面中有一个ListPicker,但SelectionChanged事件在页面加载时会被多次调用。为了避免这种情况,我一直遵循我在这里提出的前一个问题,其中的建议是,不要让Elistpicker_Selection更改在datatemplate中创建父stackpanel…,在stackpanel中创建一个名为stk_tap的tap事件,并“使用此tap stk_tap执行您的操作,如下所示,”,此事件也会在每次调用选择更改时被调用,但它不会表现出与选择更改事件类似的错误行为

现在我已经相应地调整了我的解决方案,但我不知道如何确定ListPicker的哪个项目正在被选中或当前被选中。此外,我还删除了ListPicker中的ListPicker SelectionChanged事件,因为我认为StackPanel可以获取该项目,但我不确定这是否正确,或者如何实现

XAML

*编辑:我如何更新我的解决方案

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