Эта проблема сводила меня с ума. У меня есть ListPicker, который динамически заполняется несколькими элементами. Я разместил объявленный обработчик события SelectionChanged в событии Loaded моей страницы. Когда пользователь нажимает на определенный элемент на странице, видимость ListPicker будет переключаться с Collpased на Visible, и я устанавливаю значения ListPicker. Проблема в том, что индекс ListPicker будет основан на настройках пользователей, поэтому из трех элементов текущий индекс может быть 1, а не 0, как и по умолчанию. Мне нужно показать 1 как текущий элемент в ListPicker без срабатывания события SelectionChanged (который выполняет операции, основанные на текущем индексе). Тогда и только тогда, когда пользователь меняет выделенный элемент, мне нужно, чтобы событие SelectionChanged срабатывало.
Основная причина этого заключается не только в том, что пользователь должен видеть свою текущую настройку в ListPicker, когда она отображается, но и в событиях события SelectionChanged, которые перезаписывают то, что в настоящее время существует, что является чрезвычайно запутанным и не предполагается, пользователь указывает.
То, что у меня сейчас, выглядит следующим образом
XAML
<toolkit:ListPicker x:Name="lp" Visibility="Collapsed" Margin="12" Width="300"/>
XAML.CS
private void Page_Loaded(object sender, RoutedEventArgs e)
{
lp.SelectionChanged += lp_SelectionChanged;
}
void EditableEllipse_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (sender != null)
{
DependencyObject tappedElement = e.OriginalSource as UIElement;
// find parent UI element of type PhotoThumbnail
//PhotoThumbnail i = this.FindParentOfType<PhotoThumbnail>(tappedElement);
i = this.FindParentOfType<PhotoThumbnail>(tappedElement);
if (i != null)
{
BuildControl(i);
}
}
}
private void BuildControl(PhotoThumbnail pp)
{
switch(pp.NName)
{
case "flip":
List<ListPickerItem> l = new List<ListPickerItem>();
l.Add(new ListPickerItem { Name = "Flip_Vertical", Content = AppResources.App_Flip_Vertical });
l.Add(new ListPickerItem { Name = "Flip_Horizontal", Content = AppResources.App_Flip_Horizontal });
l.Add(new ListPickerItem { Name = "Flip_Both", Content = AppResources.App_Flip_Both });
lp.ItemsSource = l; //Code execution jumps from here to ValueChanged event immediately
lp.Visibility = Visibility.Visible;
lp.SelectedIndex = Settings.Flip.Value - 1;
break;
..
}
}
private async void lp_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (lp.SelectedIndex != -1) //always defaults to = 0
{
var item = (sender as ListPicker).SelectedItem;
string name = ((ListPickerItem)item).Name;
if (name != null)
{
switch (name)
{
case "Flip_Vertical":
Settings.Flip.Value = 1;
..perform process based on current Setting.Flip.Value.. break;
case "Flip_Horizontal":
Settings.Flip.Value = 2;
..perform process based on current Setting.Flip.Value..
break;
case "Flip_Both":
Settings.Flip.Value = 3;
..perform process based on current Setting.Flip.Value..
break;
...
}
}
}
Попытайтесь использовать порядок техники (путем отцепления и переустановки события)
private void BuildControl(PhotoThumbnail pp)
{
switch(pp.NName)
{
case "flip":
// unhook event
lp.SelectionChanged -= lp_SelectionChanged;
List<ListPickerItem> l = new List<ListPickerItem>();
l.Add(new ListPickerItem { Name = "Flip_Vertical", Content = AppResources.App_Flip_Vertical });
l.Add(new ListPickerItem { Name = "Flip_Horizontal", Content = AppResources.App_Flip_Horizontal });
l.Add(new ListPickerItem { Name = "Flip_Both", Content = AppResources.App_Flip_Both });
lp.ItemsSource = l; //Code execution jumps from here to ValueChanged event immediately
lp.Visibility = Visibility.Visible;
lp.SelectedIndex = Settings.Flip.Value - 1;
// after setting the index, rehook the event
lp.SelectionChanged += lp_SelectionChanged;
break;
..
}
}
lp.SelectionChanged += lp_SelectionChanged
изPage_Loaded
?