为什么当我在框架之间移动页面时,它会消失?

Why does Page disappears when I move it between frames?(为什么当我在框架之间移动页面时,它会消失?)
本文介绍了为什么当我在框架之间移动页面时,它会消失?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有Main框架的窗口,其中包含一个Page。我还有另一个包含第一页的页面。我想在这两页之间移动。这是第一页:
第二个是:
当我第一次运行这款应用程序时,一切都很正常。但当我返回到第一页,然后又回到第二页时,第二页框架中的第一页消失了:
以下是MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public static TestPage testPage = new TestPage();
    public static CombinedPage combinedPage = new CombinedPage();
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Butt1_Click(object sender, RoutedEventArgs e)
    {
        combinedPage.TimerFrame.Content = null;
        Main.Content = testPage;
    }

    private void Butt2_Click(object sender, RoutedEventArgs e)
    {
        Main.Content = null;
        combinedPage.Call();
        Main.Content = combinedPage;
    }
}

MainWindow.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="80 px"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="70 px" ></ColumnDefinition>
        <ColumnDefinition Width="*" ></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Vertical" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.RowSpan="2">
        <Button x:Name="Butt1" Height="50" Width="50" Click="Butt1_Click"  />
        <Button x:Name="Butt2" Height="50" Width="50" Click="Butt2_Click"  />
    </StackPanel>
    <Frame NavigationUIVisibility="Hidden" x:Name="Main" Grid.Row="1" Grid.Column="1"/>
</Grid>

CombinedPage.xaml.cs

public partial class CombinedPage : Page
{
    public CombinedPage()
    {
        InitializeComponent();
    }

    public void Call()
    {
        TimerFrame.Content = MainWindow.testPage;
    }
}

CombinedPage.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <GridSplitter Grid.Column="1" Grid.RowSpan="3" Width="5" Background="Black"
                VerticalAlignment="Stretch" HorizontalAlignment="Center" />
    <GridSplitter Grid.Row="1" Grid.ColumnSpan="3" Height="5" Background="Black"
                VerticalAlignment="Center" HorizontalAlignment="Stretch" />

    <Frame NavigationUIVisibility="Hidden" x:Name="TimerFrame" Grid.Row="0" Grid.Column="0"/>
</Grid>

所以最后一个问题是-当我在页面之间移动时,为什么第一页消失了?

推荐答案

我最近都在使用安静的Frame。这是一个非常强大的控件,仅当您想要显示Web内容时才推荐使用。
我强烈建议每个页面/视图使用ContentControlDataTemplate
请参见本例:C# WPF Navigation Between Pages (Views)。
使用建议的解决方案使导航更加方便。它消除了像你这样的麻烦。此外,您还可以使用更多选项来自定义页面导航,如添加动画。

问题是Frame实现了特殊的导航流。设置Frame.SourceFrame.Content属性不会立即完成导航,即不会立即应用目标Page值:

(来源:Microsoft Docs: Navigation Overview)

如图所示,设置Frame.SourceFrame.Content会导致一系列以LoadCompleted事件结束的事件。
您当前导航到页面的时间太早。testPage仍加载在最近的Frame中,因此无法在下一个Frame中显示。

您的场景的特殊问题是,您希望在不同的Frame实例中加载相同的Page实例。由于Page实例只能呈现一次,因此您必须从最近的Frame中卸载Page实例,才能在下一个Frame中显示它。

要解决问题,您有两个选择:

  1. 处理null赋值/Frame重置后的LoadCompleted事件,并从处理程序设置新的Page

  2. 使用优先级至少为DispatcherPriority.BackgroundDispatchernull分配/Frame重置后推迟分配。例如:

    Dispatcher.InvokeAsync(() => Main.Navigate(testPage), DispatcherPriority.Background);
    

我建议处理LoadCompleted事件,因为该行为肯定更具确定性:

private void Butt1_Click(object sender, RoutedEventArgs e)
{
  combinedPage.TimerFrame.LoadCompleted += SetMainFrame_OnLoadCompleted;
  combinedPage.TimerFrame.Navigate(null);
}

private void SetMainFrame_OnLoadCompleted(object sender, NavigationEventArgs e)
{
  combinedPage.TimerFrame.LoadCompleted -= SetMainFrame_OnLoadCompleted;
  Main.Navigate(testPage);
}

private void Butt2_Click(object sender, RoutedEventArgs e)
{
  Main.LoadCompleted += SetFrameContents_OnLoadCompleted;
  Main.Navigate(null);
}

private void SetFrameContents_OnLoadCompleted(object sender, NavigationEventArgs e)
{
  Main.LoadCompleted -= SetFrameContents_OnLoadCompleted;
  combinedPage.Call();
  Main.Navigate(combinedPage);
}

这篇关于为什么当我在框架之间移动页面时,它会消失?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)