【问题标题】:ListPicker SelectionChanged Event Called Multiple Times During Navigation导航期间多次调用 ListPicker SelectionChanged 事件
【发布时间】:2017-09-05 02:30:20
【问题描述】:

我的一个应用程序页面中的 ListPicker 中有一个 SelectionChanged 事件,该事件在页面加载之前触发了多次。 This is really inconvenient for me as when an item is selected, a MessageBox is displayed (and other actions will be performed).每次页面为 NavigatedTo 时,MessageBox 会显示两次。我该如何解决这个问题?

XAML

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

【问题讨论】:

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


    【解决方案1】:

    嗯,这就是 listpicker 的行为方式,你能做的最好的事情就是不要让 ThemeListPicker_SelectionChanged 在数据模板中创建一个父堆栈面板,有点像这样

    <Listpicker.ItemTemplate>
    <DataTemplate x:Name="PickerItemTemplate"> 
                   <StackPanel tap="stk_Tap"> 
                        <TextBlock/> 
                    </StackPanel> 
                </DataTemplate>
    </Listpicker.ItemTemplate>
    <Listpicker.FullModeItemTemplate>
                <DataTemplate x:Name="PickerFullModeItemTemplate"> 
                    <StackPanel tap="stk_Tap"> 
                        <TextBlock/> 
                    </StackPanel> 
                </DataTemplate>
    <Listpicker.FullModeItemTemplate>
    

    现在使用此点击 stk_Tap 执行您的操作,因为每次调用选择更改时也会调用此事件,但它不会表现出像选择更改事件那样的错误行为。

    希望这会有所帮助。

    【讨论】:

    • 如何从 stk_Tap 事件中获取 ListPicker 中选中的项目?
    【解决方案2】:

    在 ListPicker 加载后附加 SelectionChanged 事件。

            ...
            InitializeComponent();
            YourListPicker.Loaded += YourListPicker_Loaded;
            ...
    
        private void YourListPicker_Loaded(object sender, RoutedEventArgs e)
        {
            YourListPicker.SelectionChanged += YourListPicker_SelectionChanged;
        }
    

    【讨论】:

    • 我将不得不尝试一下,根据我选择的答案,这将是比我目前正在做的更可取的解决方案。
    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多