Как получить элемент Tapped из события Tapped в StackPanel

У меня есть ListPicker на странице приложения, но событие SelectionChanged вызывается несколько раз при загрузке страницы. Чтобы избежать этого, я следил за предыдущим вопросом, который задал здесь Событие, вызываемое несколько раз во время навигации, в котором было предложено вместо того, чтобы сделать ThemeListPicker_SelectionChanged родительской панелью стека внутри шаблона данных..', создать событие касания в StackPanel с именем stk_Tap и 'использовать это касание stk_Tap для выполнения вашего действия так как это событие также будет вызываться каждый раз, когда вызывается изменение выбора, но оно не будет демонстрировать ошибочное поведение, подобное событию изменения выбора.

Теперь я соответствующим образом скорректировал свое решение, но я не знаю, как определить, какой элемент ListPicker выбран или выбран в данный момент. Также я удалил событие ListPicker SelectionChanged в ListPicker, потому что я думал, что 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

        }
    }

person Matthew    schedule 17.12.2013    source источник
comment
ну, вы также можете получить значение SelectedIndex с событием касания.   -  person A.K.    schedule 17.12.2013


Ответы (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. поэтому измените метод r 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;
   }
person Jaihind    schedule 17.12.2013
comment
Хорошо, я обязательно попробую это. Дело в том, что у меня есть MainPage, а затем ThemeListPicker находится на странице настроек, которая является NavigatedTo из MainPage. Так применима ли настройка e.NavigationMode != NavigationMode.Back? Как установка этого оператора предотвратит двойное срабатывание ThemeListPicker_SelectionChanged, когда SettingsPage имеет значение NavigateTo? Кроме того, может ли другой вариант просто установить ItemsSource ThemeListPicker в событии SettingsPage Loaded? - person Matthew; 17.12.2013
comment
@Matthew всякий раз, когда вы устанавливаете источник элемента ThemeListPicker, срабатывает событие selectionchanged. Нет никакого способа ограничить это. Поэтому я предлагаю вам выполнить свою работу над любым другим событием и удалить событие selectionchanged. - person Jaihind; 18.12.2013
comment
В порядке. Я удалил событие ThemeListPicker_SelectionChanged, как показано в моем редактировании выше. Я думал использовать событие StackPanel Tap, чтобы получить текущий выбранный элемент в ListPicker. Мой вопрос заключается именно в том, как я могу получить текущий выбранный элемент в ThemeListPicker из события StackPanel Tap? - person Matthew; 18.12.2013
comment
@Matthew, отредактируй, пожалуйста, посмотри, у меня работает - person Jaihind; 19.12.2013
comment
По какой-то причине в моем Edit2, где я добавил var selectedItem1 = (sender as StackPanel).DataContext as ListPicker; selectedItem1 = null, хотя при наведении курсора на DataContext во время отладки я вижу текущий элемент ListPicker? - person Matthew; 21.02.2014