Почему мой фрейм ожидает перехода, пока не появится другой MessageBox? - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь перейти к Page после того, как пользователь выбирает «Да» из отображаемого MessageBox, но мой Frame не выполняет навигацию, пока я не отобразлю другое MessageBox, сообщающее пользователю что навигация завершена.

Я попытался добавить еще Thread.Sleep(5000); и MessageBox после «Успеха» MessageBox, (чтобы увидеть, обновляется ли Frame только после завершения всего метода), но кадр все равно будет перемещаться, как только появляется «Успех» MessageBox.

Вот мой MainWindow.xaml:

<Window x:Class="WpfApp23.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp23"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10*" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Frame x:Name="MyFrame" Content="" Margin="0" />
        <Button x:Name="MyButton" Content="Navigate" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center" Width="75" Click="MyButton_Click" Grid.Row="1" />
    </Grid>
</Window>

Вот мой обработчик события нажатия кнопки из MainWindow.xaml.cs:

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    MessageBoxResult messageBoxResult = MessageBox.Show("Navigate to page?", "Test", MessageBoxButton.YesNo);

    if (messageBoxResult == MessageBoxResult.Yes)
    {
        MyFrame.NavigationService.Navigate(new Uri("Test.xaml", UriKind.Relative));
        Thread.Sleep(5000); // Used to exaggerate time it takes to do other tasks.
        MessageBox.Show("Success");
    }
}

Test.xaml это просто фиктивная страница, которую я создал, которая содержит только ярлык:

<Grid>
    <Label Content="Test Page" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center" />
</Grid>

Я бы хотел, чтобы Frame осуществлял навигацию, как только пользователь выбрал «Да», так почему он ожидает перехода, пока не появится «Успех» MessageBox?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Проблема, с которой я столкнулся, заключалась в том, что мой Frame не обновлялся до тех пор, пока не был показан «Успех» MessageBox. После поиска я смог найти ответ , в котором упоминается "хак" под названием Application.DoEvents().

Но поскольку я использую WPF, а не WinForms, метод Application.DoEvents() отсутствует. Вместо этого вам нужно позвонить

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));

После перехода на вашу страницу и перед выполнением других задач. Здесь - это ссылка на конкретный ответ, который я нашел.

0 голосов
/ 04 января 2019

Вы не можете спать, отобразить окно сообщения и перейти к странице одновременно в одной и той же теме.

Если вы хотите отобразить MessageBox после , к которой была перемещена страница, вы можете обработать событие Navigated.

Это событие происходит , когда содержимое, к которому осуществляется навигация, было найдено и доступно из свойства содержимого, хотя, возможно, оно не завершило загрузку :

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    MessageBoxResult messageBoxResult = MessageBox.Show("Navigate to page?", "Test", MessageBoxButton.YesNo);

    if (messageBoxResult == MessageBoxResult.Yes)
    {
        System.Windows.Navigation.NavigatedEventHandler handler = null;
        handler = async (ss, ee) =>
        {
            await Task.Delay(1000);
            MessageBox.Show("Success");
            MyFrame.Navigated -= handler;
        };
        MyFrame.Navigated += handler;
        MyFrame.NavigationService.Navigate(new Uri("Test.xaml", UriKind.Relative));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...