Window vs Page vs UserControl cho điều hướng WPF?


192

Tôi hiện đang viết một ứng dụng máy tính để bàn, nhưng dường như tôi không thể hiểu được những gì sẽ sử dụng khi chuyển hướng ai đó đến một phần mới của ứng dụng.

Lựa chọn của tôi dường như là

  • Cửa sổ
  • Trang
  • Kiểm soát người dùng

nhưng tôi không hiểu sự khác biệt giữa chúng là gì và khi nào tôi nên sử dụng mỗi loại.

Ai đó có thể giải thích sự khác biệt cho tôi không, và đưa ra một ví dụ về những tình huống / ứng dụng bạn có thể sử dụng cho mỗi tình huống?

Câu trả lời:


337

Một đối tượng Window đúng như tên của nó: nó là một Windowứng dụng mới cho ứng dụng của bạn. Bạn nên sử dụng nó khi bạn muốn bật lên một cửa sổ hoàn toàn mới. Tôi không thường sử dụng nhiều hơn một Windowtrong WPF vì tôi thích đưa nội dung động vào Cửa sổ chính thay đổi dựa trên hành động của người dùng.

Một trang là một trang bên trong cửa sổ của bạn. Nó chủ yếu được sử dụng cho các hệ thống dựa trên web như XBAP, nơi bạn có một cửa sổ trình duyệt duy nhất và các trang khác nhau có thể được lưu trữ trong cửa sổ đó. Nó cũng có thể được sử dụng trong Ứng dụng Điều hướng như sellmeadog nói .

Một UserControl là một điều khiển người dùng tạo tái sử dụng mà bạn có thể thêm vào giao diện người dùng của bạn giống như cách bạn sẽ thêm bất kỳ điều khiển khác. Thông thường tôi tạo một UserControlkhi tôi muốn xây dựng một số chức năng tùy chỉnh (ví dụ: a CalendarControl) hoặc khi tôi có một lượng lớn mã XAML liên quan, chẳng hạn như Viewkhi sử dụng mẫu thiết kế MVVM.

Khi điều hướng giữa các cửa sổ, bạn chỉ cần tạo một Windowđối tượng mới và hiển thị nó

var NewWindow = new MyWindow();
newWindow.Show();

nhưng như tôi đã nói ở đầu câu trả lời này, tôi không muốn quản lý nhiều cửa sổ nếu có thể.

Phương pháp điều hướng ưa thích của tôi là tạo một số khu vực nội dung động bằng cách sử dụng ContentControlvà điền vào đó với UserControlbất kỳ chế độ xem hiện tại nào.

<Window x:Class="MyNamespace.MainWindow" ...>
    <DockPanel>
        <ContentControl x:Name="ContentArea" />
    </DockPanel>
</Window>

và trong sự kiện điều hướng của bạn, bạn có thể chỉ cần đặt nó bằng cách sử dụng

ContentArea.Content = new MyUserControl();

Nhưng nếu bạn đang làm việc với WPF, tôi rất khuyến nghị mẫu thiết kế MVVM. Tôi có một ví dụ rất cơ bản trên blog của mình minh họa cách bạn điều hướng bằng MVVM, sử dụng mẫu này:

<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>

Ảnh chụp màn hình1 Ảnh chụp màn hình2


Tôi có một câu hỏi, MVVM từ những gì tôi có thể nói dường như hoạt động tốt với các bộ dữ liệu, nhưng đối với các biểu mẫu tĩnh như ví dụ một biểu mẫu nhập cảnh cho kiểm toán. Tôi có nên sử dụng một trang hoặc điều khiển người dùng cho các trang tĩnh?
Herrozerro

2
@Herrozerro Nếu tôi muốn tạo biểu mẫu Kiểm toán bằng MVVM, tôi sẽ AuditViewModelchứa tất cả dữ liệu và chức năng cho biểu mẫu và tôi sẽ vẽ nó bằng AuditViewUserControl hoặc chỉ làDataTemplate
Rachel

1
Cảm ơn! Trên thực tế Sau khi đi qua blog của bạn và một vài trang web khác, tôi hiểu rõ hơn về cách MVVM hoạt động.
Herrozerro

1
@Herrozerro ViewModelThông thường được xây dựng cho View, trong khi đó Modelslà các đối tượng dữ liệu và các lớp ("khối xây dựng") được sử dụng bởi ứng dụng của bạn ( ViewModels)
Rachel

1
@ GTS13 Có, tôi làm điều đó thường xuyên. Tôi liên kết TabControl.ItemsSourcebộ sưu tập các đối tượng và sử dụng DataTemsheet để cho WPF biết cách vẽ từng loại đối tượng trên mỗi tab. Thường là một cái gì đó như thế này
Rachel

13
  • Cửa sổ là như thế Windows.Forms.Form, vì vậy chỉ là một cửa sổ mới
  • Trang là, theo tài liệu trực tuyến :

    Đóng gói một trang nội dung có thể được điều hướng và lưu trữ bởi Windows Internet Explorer, NavigationWindow và Frame.

    Vì vậy, về cơ bản bạn sử dụng điều này nếu bạn hình dung một số nội dung HTML

  • UserControl dành cho các trường hợp khi bạn muốn tạo một số thành phần có thể sử dụng lại (nhưng không phải là thành phần độc lập) để sử dụng nó trong nhiều mục khác nhauWindows


Cảm ơn bạn vì câu trả lời. Vì vậy, ví dụ nếu bạn đang xây dựng một ứng dụng có các nút ở bên trái nhưng bạn muốn xem nội dung bên trong các nút này ở phía bên tay phải, bạn sẽ sử dụng điều khiển người dùng?
Steve

@Steve: sử dụng UserControltrong trường hợp bạn nghĩ rằng cùng một bộ điều khiển bạn sẽ sử dụng trên cửa sổ này, bạn cũng sẽ sử dụng một số điều khiển khác, vì vậy thay vì viết mã kép, chỉ cần tạo một UserControl, nhưng nếu không, chỉ cần đặt các điều khiển để trực quan hóa dữ liệu của bạn trên Windowchính nó, ở phía bên phải từ các nút bạn đã đặt.
Tigran

6
Có thêm một mục mà tôi nghĩ nên thêm vào : DataTemplates. Chúng được sử dụng khi bạn muốn nói với WPF cách vẽ một mục trong một phạm vi cụ thể. Ví dụ: nếu bạn muốn vẽ Buttonshình tròn của mình, bạn chỉ cần sử dụng DataTemplatethay vì a UserControl. Tôi thường sử dụng UserControlskhi tôi muốn một điều khiển mới có chức năng riêng hoặc khi tôi có nhiều XAML cho một thành phần, chẳng hạn như cho a View. Đối với các bit XAML nhỏ hơn không yêu cầu bất kỳ chức năng đặc biệt nào, bạn nên sử dụng DataTemplatethay vì tạo mộtUserControl
Rachel

3
Nói chung, nội dung của a Pagekhông phải là HTML mà là XAML. Tuy nhiên, a Pageđược gắn vào khung điều hướng tương tự về mặt khái niệm với cách điều hướng được thực hiện trong trình duyệt web. (Và các trang thậm chí có thể được lưu trữ trong trình duyệt nếu ứng dụng là ứng dụng XBAP.)
Martin Liversage

6

Tất cả phụ thuộc vào ứng dụng bạn đang cố gắng xây dựng. Sử dụng Windows nếu bạn đang xây dựng một ứng dụng dựa trên hộp thoại. Sử dụng Pages nếu bạn đang xây dựng một ứng dụng dựa trên điều hướng .UserControls sẽ hữu ích bất kể bạn đi theo hướng nào vì bạn có thể sử dụng chúng trong cả Windows và Pages.

Một nơi tốt để bắt đầu khám phá là ở đây: http://windowsclient.net/learn


5

Chúng tôi thường sử dụng One Main Windowcho ứng dụng và các cửa sổ khác có thể được sử dụng trong các tình huống như khi bạn cần cửa sổ bật lên vì thay vì sử dụng các điều khiển bật lên trong XAML không hiển thị, chúng tôi có thể sử dụng Cửa sổ hiển thị tại thời điểm thiết kế để dễ dàng làm việc với

mặt khác, chúng tôi sử dụng nhiều trang để điều hướng từ màn hình này sang màn hình khác như màn hình quản lý người dùng đến Màn hình đặt hàng, v.v ... Trong Cửa sổ chính, chúng tôi có thể sử dụng Frameđiều khiển để điều hướng như bên dưới XAML

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

C #

     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");
        }
    }

Đó là một cách thực hiện Chúng ta cũng có thể sử dụng Điều khiển tab thay vì Fram và Thêm trang vào đó bằng Từ điển trong khi thêm kiểm tra trang mới nếu điều khiển đã tồn tại rồi chỉ điều hướng nếu không thêm và điều hướng. Tôi hy vọng điều đó sẽ giúp được ai đó


2

Hầu hết tất cả đã đăng câu trả lời đúng. Tôi muốn thêm một vài liên kết, để bạn có thể tham khảo chúng và có những ý tưởng rõ ràng và tốt hơn về cùng:

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

Sự khác biệt giữa trang và cửa sổ đối với WPF: Page vs Window trong WPF?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.