2015-10-20 3 views
3

Я хочу показать contentDialog как экран входа, как только приложение будет запущено. Только если пользователь аутентифицирован, я хочу показать остальную страницу, иначе ничего не получится.ContentDialog.showAsync на Win 10 Универсальное окно app

Я не хочу, чтобы пользователь нажал любую кнопку, чтобы загрузить этот диалог содержимого, он должен появиться сам по себе, как только приложение будет запущено.

В конструкторе MainPage я вызываю метод для отображения диалогового окна.

Но я получаю это исключение «Значение не входит в ожидаемый диапазон». (System.ArgumentException), и приложение после этого не загружается.

это от моего MainPage.xaml

<ContentDialog x:Name="loginDialog" 
        VerticalAlignment="Stretch" 
        Title="Login" 
        PrimaryButtonText="Login" 
        SecondaryButtonText="Cancel"> 
        <StackPanel> 
         <StackPanel> 
          <TextBlock Text="Username" /> 
          <TextBox x:Name="Username" ></TextBox> 
         </StackPanel> 
         <StackPanel> 
          <TextBlock Text="Password" /> 
          <TextBox x:Name="Password" ></TextBox> 
         </StackPanel> 
        </StackPanel> 
       </ContentDialog> 

не возможно ли это? Может ли ContentDialog запускаться только при нажатии кнопки? enter image description here enter image description here

ответ

2

Прежде всего, вы только хотите, чтобы показать всплывающее окно, когда пользователь находится на этой странице, так переместить код из конструктора методы OnNavigatedTo. Там действительно была ошибка, когда пользовательский интерфейс не был готов, поэтому легкий взлом - await Task.Delay(1);, чтобы дать приоритет, а затем вызвать метод ShowPopup.

protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 
    await Task.Delay(1); 
    var result = await loginDialog.ShowAsync(); 
} 

Edit: в качестве @sibbl упоминалось, даже разумнее использовать страницу Loaded событие, если вы используете код-позади. Я пошел на OnNavigatedTo, поскольку я всегда использую Prism для MVVM, а в ViewModel это метод OnNavigatedTo, который вам нужно реализовать.

private async void MainPage_OnLoaded(object sender, RoutedEventArgs e) 
{ 
    var result = await ShowPopup(); 
} 

Дополнительное примечание: вы должны NOT use async void для вашего метода ShowPopup как это должно быть использовано только для eventhandlers. Я действительно рекомендую вам зайти на асинхронный/ждущий, чтобы предотвратить «странные» ошибки. Таким образом, ваш код сводится к:

protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 
    await Task.Delay(1); 
    var result = await ShowPopup(); 
} 

private Task<ContentDialogResult> ShowPopup() 
{ 
    return loginDialog.ShowAsync().AsTask(); 
} 
+0

Я только что выполнил весь код, который вы указали выше. но я все равно получаю ту же ошибку. :( – sagar

+0

Я увеличил задержку от 1 до 100. И теперь это работает. Спасибо большое! – sagar

+2

Лучше использовать обработчик событий OnLoaded на странице, чтобы абсолютно убедиться, что XAML был загружен, и там есть loginDialog. все еще не хватает времени на некоторых устройствах, поэтому будьте готовы к сбоям ... – sibbl

Смежные вопросы