Во-первых, я не смог воспроизвести проблему с модалом, которая не отображалась до второго нажатия кнопки. Возможно, вам придется предоставить больше кода для этого. Чтобы даже использовать ваш пример кода, мне пришлось заменить var list = await App.Database.GetChartsAsync();
чем-то другим, чтобы имитировать долгосрочную задачу, которая возвращает пустой список. Также пришлось создать тип Chart
со свойством Name
. Не говоря уже о BaseViewModel
. В будущем, пожалуйста, предоставьте весь код для воспроизведения проблемы, чтобы от человека, который пытается вам помочь, требовалась минимальная работа. Существует концепция переполнения стека, называемая MCVE (минимальный, полный, проверяемый пример): http://stackoverflow.com/help/mcve
При этом, возможно, первый щелчок фактически фокусирует эмулятор и делает его активным приложением, а затем второйэто первый фактический клик по кнопке? Это я могу воспроизвести. Таким образом, если эмулятор не является приложением переднего плана, вы должны щелкнуть его один раз, чтобы сделать его активным, и тогда ваше приложение будет обрабатывать щелчки.
Что касается нежелательного пользовательского интерфейса, вы понимаете, что интерфейс выбора - это, по сути, кликабельная метка, которая при нажатии отображает фактический модальный режим выбора? Таким образом, когда вы делаете его видимым, то, что вы делаете видимым, это UI надписи, у которого есть строка и заголовок (если он установлен), и когда вы фокусируете эту метку, то отображается фактическое диалоговое окно выбора. Если вы вообще не хотите видеть метку пользовательского интерфейса, зачем делать ее видимой? Вы можете сфокусировать его, не делая его видимым, поэтому просто удалите строку NewSubjectExisChrtPck.IsVisible = true;
В качестве примечания, когда вы вызываете _viewModel.LoadChartsCommand.Execute(null);
, который вызывает асинхронный метод, var list = await App.Database.GetChartsAsync();
, поэтому LoadChartsCommand
возвращаетдо того, как вы установите свойство Charts, а также код, следующий за вызовом _viewModel.LoadChartsCommand.Execute(null);
, также выполняется до того, как LoadChartsCommand
действительно завершится, так что вы делаете средство выбора видимым и фокусируете его до завершения LoadChartsCommand
, так что если вызагружали фактические предметы для показа сборщика, они могут быть там не в первый раз. Может быть, это всего лишь пример кода, но я не вижу смысла использовать команду здесь, скорее, вам следует просто вызвать ожидаемое задание. Вы не привязаны к LoadChartsCommand
, поэтому я не вижу смысла для вас даже использовать Command
в этом сценарии. Вместо этого я предлагаю сделать ExecuteLoadChartsCommand
публичным и вызвать его напрямую, например:
private async void NewSubjectExisChrtBtn_Clicked(object sender, EventArgs e)
{
//_viewModel.LoadChartsCommand.Execute(null); // Returns immediately, so picker not loaded with items yet.
await _viewModel.ExecuteLoadChartsCommand(); // Waits for method to finish before before presenting the picker.
//NewSubjectExisChrtPck.IsVisible = true;
NewSubjectExisChrtPck.Focus();
}