Я новичок в XAML и C #, но мне нравилось работать с ним в течение нескольких недель, когда я играл с ним.Я начал работать над приложением и собрал простую страницу «Настройки» в XAML;теперь я пытаюсь подключить события к элементам управления, чтобы (а) обновить состояние приложения, когда пользователь взаимодействует с ними, и (б) иметь текущее состояние при посещении страницы.
Я нажал два(связанные) дорожные блоки, хотя:
набор инструментов: элемент управления ListPicker, кажется, не работает должным образом, когда я определяю «ListPickerItem» в XAML, поэтому в конструкторе SettingsPage яустановите содержимое вручную:
lpColour.ItemsSource = new List<string>()
{
"Red","Blue","Green","Custom…"
};
lpColour.SelectedIndex = 1; // set the currently selected item to "Blue"
Однако, поскольку у элемента управления (в этом примере lpColour) есть событие на SelectionChanged, два события запускаются (одно с выбранным «Red» в качестве поля заполнено, затем другоекогда выбран "синий").Я не хочу обрабатывать «SelectionChanged» в данный момент;только когда пользователь взаимодействует с самим элементом управления (например, если он выбирает «Пользовательский…»), я могу открыть отдельное текстовое поле и выделить его; но я не хочу этого делать, когда настраиваюстраницу, и у них ранее был выбран «Пользовательский…», иначе пользователь получит клавиатуру, появляющуюся, как только он откроет страницу настроек ...)
- Аналогично, я обнаружил, что элементы управления ToggleSwitch будутзапускать события "Checked" и "Unchecked", когда свойство IsChecked изменяется на что-то новое.Опять же, есть ли способ игнорировать или подавлять это событие при изменении кода?(Я вроде как обошел это сейчас, просто используя «Clicked», но с точки зрения обучения было бы неплохо знать, как с этим справиться).
Я думал, может бытьбыл какой-то способ получить «происхождение» (например, «код» или «пользовательский ввод») события из «SelectionChangedEventArgs» или «RoutedEventArgs» ... но, возможно, нет?
Я также пыталсяустановка «инициализированного» значения bool (по умолчанию «false», после запуска конструктора установите «true») и оберните код обработки событий в что-то вроде «if (initialized) {...}»; но событие по-прежнемупохоже, что он был запущен после того, как конструктор был создан для кода "lpColour.ItemSource = ..." и "lpColour.SelectedIndex = 1", который был выполнен, пока "initialized" был "false". Очень странно.: P
Надеюсь, я объясняю это ясно - я никогда не писал здесь раньше!
Буду признателен за любую помощь, которую вы можете предложить. Спасибо!
ОБНОВЛЕНИЕ - благодаря ответу @ MyKuLLSKI, это прекрасное место для работы.
В качестве примечания, опираясь на эту идею, я попытался сохранить их как «List's первоначально» и иметь «IgnoreSelectionChanged» в виде целого числа, которое будет «обратным отсчетом» (поэтому перед установкой ItemSource ListPicker я бы установил «IgnoreSelectionChanged + = 2»"(чтобы учесть два события, которые будут уволены);Точно так же я бы установил «IgnoreSelectionChanged ++» непосредственно перед установкой SelectedIndex вручную ... это, похоже, тоже работает.
Однако использование «ObservableCollection», привязанного к ListPicker, и полагаться на это, чтобы сообщить об изменениях, кажется, возможнолучший способ, чем использовать собственное событие ListPicker «SelectionChanged», поэтому я изменю свой код, чтобы использовать его вместо этого.
Еще раз спасибо!