หน้าต่างวัตถุเป็นเพียงสิ่งที่ดูเหมือนกใหม่Window
สำหรับงานของคุณ คุณควรใช้มันเมื่อคุณต้องการเปิดหน้าต่างใหม่ทั้งหมด ฉันมักจะไม่ใช้มากกว่าหนึ่งรายการWindow
ใน WPF เพราะฉันต้องการใส่เนื้อหาแบบไดนามิกในหน้าต่างหลักของฉันที่เปลี่ยนแปลงไปตามการกระทำของผู้ใช้
หน้าคือหน้าภายในหน้าต่างของคุณ ส่วนใหญ่จะใช้สำหรับระบบบนเว็บเช่น XBAP ที่คุณมีหน้าต่างเบราว์เซอร์เดียวและหน้าเว็บที่แตกต่างกันสามารถโฮสต์ในหน้าต่างนั้น นอกจากนี้ยังสามารถนำมาใช้ในโปรแกรมนำร่องเช่นsellmeadog กล่าวว่า
UserControlคือการควบคุมผู้ใช้สร้างนำมาใช้ใหม่ที่คุณสามารถเพิ่ม UI ของคุณด้วยวิธีเดียวกับที่คุณจะเพิ่มการควบคุมอื่น ๆ โดยปกติฉันจะสร้างUserControl
เมื่อฉันต้องการสร้างในฟังก์ชั่นที่กำหนดเอง (เช่น a CalendarControl
) หรือเมื่อฉันมีรหัส XAML ที่เกี่ยวข้องจำนวนมากเช่นView
เมื่อใช้รูปแบบการออกแบบ MVVM
เมื่อนำทางระหว่างหน้าต่างคุณสามารถสร้างWindow
วัตถุใหม่และแสดงวัตถุนั้นได้
var NewWindow = new MyWindow();
newWindow.Show();
แต่เหมือนที่ฉันพูดตอนต้นของคำตอบนี้ฉันไม่ต้องการจัดการหลายหน้าต่างถ้าเป็นไปได้
วิธีการนำทางที่ฉันต้องการคือการสร้างพื้นที่เนื้อหาแบบไดนามิกโดยใช้ a ContentControl
และเติมข้อมูลด้วยUserControl
มุมมองปัจจุบันที่มีอยู่
<Window x:Class="MyNamespace.MainWindow" ...>
<DockPanel>
<ContentControl x:Name="ContentArea" />
</DockPanel>
</Window>
และในเหตุการณ์การนำทางของคุณคุณสามารถตั้งค่าโดยใช้
ContentArea.Content = new MyUserControl();
แต่ถ้าคุณทำงานกับ WPF ฉันขอแนะนำรูปแบบการออกแบบ MVVM ฉันมีตัวอย่างพื้นฐานมากในบล็อกของฉันที่แสดงวิธีการนำทางโดยใช้ MVVM โดยใช้รูปแบบนี้:
<Window x:Class="SimpleMVVMExample.ApplicationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SimpleMVVMExample"
Title="Simple MVVM Example" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:HomeViewModel}">
<local:HomeView /> <!-- This is a UserControl -->
</DataTemplate>
<DataTemplate DataType="{x:Type local:ProductsViewModel}">
<local:ProductsView /> <!-- This is a UserControl -->
</DataTemplate>
</Window.Resources>
<DockPanel>
<!-- Navigation Buttons -->
<Border DockPanel.Dock="Left" BorderBrush="Black"
BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding PageViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<!-- Content Area -->
<ContentControl Content="{Binding CurrentPageViewModel}" />
</DockPanel>
</Window>