Window vs Page vs UserControl для навигации по WPF?

В настоящее время я пишу настольное приложение, но не могу понять, что использовать при перенаправлении кого-либо в новый раздел приложения.

Мои варианты выглядят как

  • окно
  • PageUserControl

но я не понимаю, в чем разница между ними и когда я должен использовать каждый из них.

Может ли кто-нибудь объяснить мне разницу и привести пример, в каких ситуациях/приложениях вы можете использовать каждое из них?

Ответ 1

Объект Окно - это то, на что это похоже: его новый Window для вашего приложения. Вы должны использовать его, когда хотите открыть совершенно новое окно. Я не часто использую более одного Window в WPF, потому что предпочитаю помещать динамический контент в основное окно, которое изменяется в зависимости от действия пользователя.

A Страница - это страница внутри вашего окна. Он в основном используется для веб-систем, таких как XBAP, где у вас есть одно окно браузера, и в этом окне могут быть размещены разные страницы. Его также можно использовать в Приложениях для навигации, например sellmeadog.

A UserControl - это многопользовательский пользовательский элемент управления, который вы можете добавить в свой интерфейс так же, как и любой другой элемент управления. Обычно я создаю UserControl, когда хочу создать некоторые пользовательские функции (например, CalendarControl) или когда у меня есть большой размер связанного кода XAML, например View при использовании шаблона проектирования MVVM.

При навигации между окнами вы можете просто создать новый объект Window и показать его

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

но, как я уже сказал в начале этого ответа, я предпочитаю не управлять несколькими окнами, если это возможно.

Мой предпочтительный способ навигации - создать некоторую область динамического содержимого с помощью 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>

Screenshot1Screenshot2

Ответ 2

  • Окно похоже на Windows.Forms.Form, поэтому просто новое окно
  • Страница, согласно онлайн-документации:

    Инкапсулирует страницу содержимого, на которую можно   и размещается в Windows Internet Explorer, NavigationWindow и Frame.

    Итак, вы в основном используете это, если собираетесь визуализировать некоторый HTML-контент.

  • UserControl предназначен для случаев, когда вы хотите создать какой-либо повторно используемый компонент (но не отдельный), чтобы использовать его в нескольких разных Windows

Ответ 3

Все зависит от приложения, которое вы пытаетесь создать. Используйте Window, если вы создаете диалоговое приложение. Используйте Page, если вы создаете приложение на основе навигации. UserControl будет полезен независимо от того, в каком направлении вы движетесь, поскольку вы можете использовать их как в Windows, так и в Pages.

Хорошее место, чтобы начать исследовать здесь: http://windowsclient.net/learn

Ответ 4

Обычно мы используем 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 вместо Fram и добавлять страницы в него, используя словарь, при добавлении новой страницы проверять, если элемент управления уже существует, только перемещаться, иначе добавлять и перемещаться. Я надеюсь, что это поможет кому-то

Ответ 5

Больше всего опубликовал правильный ответ. Я хотел бы добавить несколько ссылок, чтобы вы могли ссылаться на них и иметь четкие и лучшие идеи о том же:

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

Разница между страницей и окном относительно WPF:  Страница vs Окно в WPF?