Я новичок в XAML и C #, но мне понравилось работать с ними в течение пары недель, когда я играл с ними. Я начал работать над приложением и собрал простую страницу «Настройки» в XAML; теперь я пытаюсь подключить события к элементам управления, чтобы (а) обновить состояние приложения, когда пользователь взаимодействует с ними, и (б) получить текущее состояние при посещении страницы.
Я столкнулся с двумя (связанными) препятствиями:
инструментарий: элемент управления ListPicker, похоже, не работает хорошо, когда я определяю ListPickerItem в XAML, поэтому в конструкторе SettingsPage я установил содержимое вручную:
lpColour.ItemsSource = new List ()
{
«Красный», «Синий», «Зеленый», «Пользовательский…»
};
lpColour.SelectedIndex = 1; // устанавливаем текущий выбранный элемент на "Синий"
Однако, поскольку элемент управления (lpColour в этом примере) имеет событие для SelectionChanged, запускаются два события (одно с выбранным красным цветом при заполнении поля, а второе - с выбранным синим). Я не хочу сейчас обрабатывать "SelectionChanged"; только когда пользователь сам взаимодействовал с элементом управления (например,если они выберут «Custom…», я могу открыть отдельное текстовое поле и сфокусировать его; но я не хочу этого делать, когда я настраиваю страницу и у них ранее было выбрано «Custom…», иначе пользователь получит клавиатуру, как только откроет страницу настроек ...)
Я подумал, может быть, есть какой-то способ получить «происхождение» (например, «код» или «пользовательский ввод») события из «SelectionChangedEventArgs» или «RoutedEventArgs» ... но, может быть, нет?
Я также попытался установить "инициализированное" значение типа bool (по умолчанию "false", установлено значение "true" после запуска конструктора, и обернуть код обработки событий чем-то вроде "if (initialized) {...}"; но, похоже, событие все еще сработало после того, как Конструктор был создан для кода lpColour.ItemSource = ... и lpColour.SelectedIndex = 1, который был выполнен, когда "initialized" был "false". Очень странно.: P
Надеюсь, я объясняю это четко - я никогда не писал здесь раньше!
Буду признателен за любую помощь, которую вы могли бы предложить. Спасибо!
ОБНОВЛЕНИЕ - спасибо за ответ @ MyKuLLSKI, это дал мне отличное место для работы.
В качестве примечания, основываясь на этой идее, я попытался сохранить их как «List» изначально и иметь «IgnoreSelectionChanged» как int, который будет «вести обратный отсчет» (поэтому перед установкой ItemSource ListPicker я бы установил «IgnoreSelectionChanged + = 2 "(чтобы учесть два события, которые будут запущены); аналогичным образом я бы установил" IgnoreSelectionChanged ++ "непосредственно перед установкой SelectedIndex вручную ... это, похоже, тоже сработало.
Однако, используя границу" ObservableCollection " к ListPicker, и полагаться на него для сообщения об изменениях, возможно, лучше, чем использовать собственное событие ListPicker «SelectionChanged», поэтому я изменю свой код, чтобы использовать его.
Еще раз спасибо!