我有一個帶有主框架的視窗,其中包含一個頁面。我有另一個包含第一頁的頁面。我想在這兩個頁面之間移動。這是第一頁:
第二
頁:
第一次運行應用程式時一切正常。但是當我回到第一個頁面然后回到第二個頁面時,第二個頁面框架中的第一個頁面消失了:
這是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;
}
}
主視窗.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>
組合頁面.xaml.cs:
public partial class CombinedPage : Page
{
public CombinedPage()
{
InitializeComponent();
}
public void Call()
{
TimerFrame.Content = MainWindow.testPage;
}
}
組合頁面.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>
所以最后一個問題是 - 為什么當我在頁面之間移動時第一頁消失了?
uj5u.com熱心網友回復:
我實際上使用的是Frame安靜的。這是一個非常繁重的控制元件,僅在您想要顯示 Web 內容時才推薦使用。
我強烈建議對每個頁面/視圖使用 aContentControl和 a DataTemplate。
請參閱此示例:
(來源:Microsoft Docs:導航概述)
正如您可以從圖表中了解到的,設定Frame.Source或 會Frame.Content導致一系列以事件結束的LoadCompleted事件。
您當前導航到頁面過早。在testPage仍然裝在最近的Frame,因此不能夠被顯示在未來Frame。
您的場景的特殊問題是您希望Page在不同的Frame實體中加載相同的實體。由于該Page實體只能渲染一次,因此您必須Page從最近的實體中卸載該實體Frame,以便在下一個Frame.
要解決您的問題,您有兩種選擇:
LoadCompleted在null分配/Frame重置后處理事件并Page從處理程式設定新的。使用
Dispatcher優先級至少DispatcherPriority.Background為 的 來推遲null分配/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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/363181.html
