Window vs Page vs UserControl สำหรับการนำทาง WPF?


192

ขณะนี้ฉันกำลังเขียนแอปพลิเคชันบนเดสก์ท็อป แต่ดูเหมือนจะไม่ได้รู้ว่าจะใช้อะไรเมื่อเปลี่ยนเส้นทางบางคนไปยังส่วนใหม่ของแอปพลิเคชัน

ตัวเลือกของฉันดูเหมือนจะเป็น

  • หน้าต่าง
  • หน้า
  • UserControl

แต่ฉันไม่เข้าใจความแตกต่างระหว่างพวกเขาคืออะไรและเมื่อใดที่ฉันควรใช้แต่ละคน

มีใครช่วยอธิบายความแตกต่างให้ฉันบ้างและยกตัวอย่างสถานการณ์ที่คุณอาจใช้แต่ละสถานการณ์

คำตอบ:


337

หน้าต่างวัตถุเป็นเพียงสิ่งที่ดูเหมือนกใหม่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>

screenshot1 screenshot2


ฉันมีคำถาม MVVM จากสิ่งที่ฉันสามารถบอกได้ดูเหมือนว่าจะทำงานได้ดีกับชุดข้อมูล แต่สิ่งที่เกี่ยวกับรูปแบบคงที่เช่นเช่นรูปแบบรายการสำหรับการตรวจสอบ ฉันควรใช้เพจหรือ usercontrol สำหรับสแตติกเพจหรือไม่?
Herrozerro

2
@Herrozerro ถ้าฉันต้องการสร้างแบบฟอร์มการตรวจสอบโดยใช้ MVVM ฉันจะมีAuditViewModelข้อมูลและฟังก์ชั่นการทำงานทั้งหมดสำหรับแบบฟอร์มและฉันจะวาดมันโดยใช้AuditViewUserControl หรือเพียงแค่DataTemplate
Rachel

1
ขอบคุณ! ที่จริงหลังจากผ่านบล็อกและเว็บไซต์อื่น ๆ ของฉันฉันมีความเข้าใจที่ดีขึ้นว่า MVVM ทำงานอย่างไร
Herrozerro

1
@Herrozerro ViewModelโดยปกติแล้วจะสร้างขึ้นสำหรับในViewขณะModelsที่วัตถุข้อมูลและคลาส ("การสร้างบล็อค") ที่ใช้โดยแอปพลิเคชันของคุณ ( ViewModels)
Rachel

1
@ GTS13 ใช่ฉันทำเช่นนั้นบ่อยครั้ง ฉันผูกTabControl.ItemsSourceกับชุดของวัตถุและใช้ DataTemplates เพื่อบอก WPF วิธีการวาดวัตถุแต่ละชนิดในแต่ละแท็บ โดยปกติแล้วสิ่งนี้
Rachel

13
  • หน้าต่างเป็นเหมือนWindows.Forms.Formหน้าต่างใหม่ดังนั้น
  • หน้าคือตามเอกสารออนไลน์ :

    สรุปเนื้อหาของเพจที่สามารถนำทางไปยังและโฮสต์โดย Windows Internet Explorer, NavigationWindow และ Frame

    ดังนั้นโดยทั่วไปคุณจะใช้สิ่งนี้หากคุณจะเห็นเนื้อหา HTML บางส่วน

  • UserControlสำหรับกรณีที่เมื่อคุณต้องการสร้างส่วนประกอบที่นำกลับมาใช้ใหม่ได้ (แต่ไม่ใช่องค์ประกอบแบบสแตนด์อโลน) เพื่อใช้ในหลาย ๆ องค์ประกอบที่แตกต่างกันWindows


ขอบคุณสำหรับคำตอบ. ตัวอย่างเช่นถ้าคุณกำลังสร้างแอพที่มีปุ่มทางด้านซ้าย แต่คุณต้องการที่จะเห็นเนื้อหาภายในปุ่มเหล่านี้ทางด้านขวามือคุณจะใช้การควบคุมผู้ใช้หรือไม่?
Steve

@Steve: ใช้UserControlในกรณีที่คุณคิดว่าชุดควบคุมเดียวกันที่คุณจะใช้ในหน้าต่างนี้คุณจะใช้ในส่วนอื่น ๆ ด้วยดังนั้นแทนที่จะเขียนโค้ดสองครั้งเพียงแค่สร้าง a UserControlแต่ถ้าไม่ใช่แค่ใส่ตัวควบคุมเพื่อสร้างภาพของ ข้อมูลของคุณในWindowตัวเองทางด้านขวาจากปุ่มที่คุณพูดถึง
Tigran

6
มีหนึ่งรายการอื่น ๆ DataTemplatesที่ผมคิดว่าควรจะเพิ่มเป็น: สิ่งเหล่านี้ถูกใช้เมื่อคุณต้องการบอก WPF วิธีวาดไอเท็มภายในขอบเขตที่ระบุ ตัวอย่างเช่นถ้าคุณต้องการที่จะวาดของคุณButtonsจะเป็นวงกลมรอบคุณก็สามารถใช้แทนDataTemplate UserControlผมมักจะใช้UserControlsเมื่อฉันต้องการการควบคุมใหม่ที่มีฟังก์ชั่นของตัวเองหรือเมื่อฉันมีจำนวนมาก XAML Viewสำหรับองค์ประกอบเดียวเช่นสำหรับ สำหรับ XAML ที่มีขนาดเล็กลงซึ่งไม่ต้องการฟังก์ชันพิเศษใด ๆ คุณควรใช้DataTemplateแทนการสร้างUserControl
Rachel

3
โดยทั่วไปเนื้อหาของ a Pageไม่ใช่ HTML แต่เป็น XAML อย่างไรก็ตาม a Pageถูกผูกเข้ากับเฟรมเวิร์กการนำทางที่คล้ายกับแนวคิดในการนำทางในเว็บเบราว์เซอร์ (และหน้ายังสามารถโฮสต์ในเบราว์เซอร์หากแอปพลิเคชันเป็นแอปพลิเคชัน XBAP)
Martin Liversage

6

ทั้งหมดขึ้นอยู่กับแอพที่คุณพยายามสร้าง ใช้Windows หากคุณสร้างแอพที่ใช้ไดอะล็อก ใช้Pages ถ้าคุณกำลังสร้างapp นำทางตามUserControlจะมีประโยชน์โดยไม่คำนึงถึงทิศทางที่คุณไปคุณสามารถใช้ได้ทั้งใน Windows และ Pages

สถานที่ที่ดีในการเริ่มต้นสำรวจอยู่ที่นี่: http://windowsclient.net/learn


5

เรามักจะใช้ One Main Windowสำหรับแอปพลิเคชันและหน้าต่างอื่น ๆ สามารถใช้ในสถานการณ์เช่นเมื่อคุณต้องการป๊อปอัปเพราะแทนที่จะใช้ตัวควบคุมป๊อปอัปใน XAML ซึ่งไม่ปรากฏให้เห็นเราสามารถใช้หน้าต่างที่มองเห็นได้ในเวลาออกแบบ ที่จะทำงานกับ

ในทางกลับกันเราใช้หลาย ๆ หน้าเพื่อนำทางจากหน้าจอหนึ่งไปอีกหน้าจอหนึ่งเช่นหน้าจอจัดการผู้ใช้ไปยังหน้าจอสั่งซื้อ ฯลฯ ในหน้าต่างหลักเราสามารถใช้Frameการควบคุมการนำทางเช่นด้านล่าง XAML

    <Frame Name="mainWinFrame" NavigationUIVisibility="Hidden"  ButtonBase.Click="mainWinFrame_Click">
    </Frame>

ค#

     private void mainWinFrame_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (e.OriginalSource is Button)
            {
                Button btn = (Button)e.OriginalSource;

                if ((btn.CommandParameter != null) && (btn.CommandParameter.Equals("Order")))
                {

                    mainWinFrame.Navigate(OrderPage);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }
    }

นั่นเป็นวิธีหนึ่งในการทำเช่นนี้เรายังสามารถใช้ Tab Control แทน Fram และเพิ่มหน้ามันโดยใช้ Dictionary ในขณะที่เพิ่มการตรวจสอบหน้าใหม่ถ้าตัวควบคุมนั้นมีอยู่แล้วจากนั้นนำทางเท่านั้นเพิ่มหรือนำทาง ฉันหวังว่าจะช่วยใครซักคน


2

ส่วนใหญ่ทั้งหมดโพสต์คำตอบที่ถูกต้อง ฉันต้องการเพิ่มลิงก์ไม่กี่ลิงก์เพื่อให้คุณสามารถอ้างอิงและมีแนวคิดที่ชัดเจนและดีขึ้นเกี่ยวกับสิ่งเดียวกัน:

UserControl: http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx

ความแตกต่างระหว่างหน้าและหน้าต่างที่เกี่ยวข้องกับ WPF: Page vs Window ใน WPF?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.