Окно против страницы против UserControl для навигации WPF?

196

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

Мои варианты кажутся

  • Окно
  • Страница
  • UserControl

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

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

Стив
источник

Ответы:

342

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

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

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

Скриншот1 Скриншот2

Рэйчел
источник
У меня вопрос, MVVM, насколько я могу судить, кажется, хорошо работает с наборами данных, но как насчет статических форм, таких как, например, форма записи для аудита. Должен ли я использовать страницу или пользовательский элемент управления для статических страниц?
Herrozerro
2
@Herrozerro Если бы я хотел создать форму аудита с использованием MVVM, у меня был бы файл, AuditViewModelсодержащий все данные и функции для формы, и я бы нарисовал его, используя либо AuditViewUserControl, либо простоDataTemplate
Рэйчел
1
Благодарность! На самом деле, просмотрев ваш блог и несколько других сайтов, я лучше понимаю, как работает MVVM.
Herrozerro
1
@Herrozerro ViewModelОбычно создается для View, а Modelsэто объекты данных и классы («строительные блоки»), используемые вашим приложением ( ViewModels)
Рэйчел,
1
@ GTS13 Да, я часто так делаю. Я привязываю его TabControl.ItemsSourceк набору объектов и использую DataTemplates, чтобы сообщить WPF, как рисовать каждый тип объекта на каждой вкладке. Обычно что-то вроде этого
Рэйчел
13
  • Окно похоже Windows.Forms.Form, так что просто новое окно
  • Страница , согласно онлайн-документации :

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

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

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

Тигран
источник
Спасибо за ваш ответ. Так, например, если вы создаете приложение с кнопками слева, но хотите видеть содержимое внутри этих кнопок с правой стороны, вы бы использовали пользовательский элемент управления?
Стив
@Steve: используйте UserControlв случае, если вы думаете, что тот же набор элементов управления, который вы собираетесь использовать в этом окне, вы будете использовать и в другом, поэтому вместо написания двойного кода просто создайте UserControl, а если нет, просто поместите элементы управления для визуализации ваши данные на самом Windowсебе, справа от кнопок, которые вы использовали.
Тигран
6
Там еще один пункт , который я думаю , должен быть добавлен: DataTemplates. Они используются, когда вы хотите указать WPF, как рисовать элемент в определенной области. Например, если вы хотите нарисовать Buttonsкруглые круги, вы можете просто использовать DataTemplateвместо UserControl. Я обычно использую, UserControlsкогда мне нужен новый элемент управления с собственными функциями или когда у меня много XAML для одного компонента, например для View. Для небольших фрагментов XAML, которые не требуют каких-либо специальных функций, вы должны использовать a DataTemplateвместо созданияUserControl
Rachel
3
Как правило, содержимое Pageне HTML, а XAML. Тем не менее, элемент a Pageпривязан к структуре навигации, которая концептуально аналогична тому, как осуществляется навигация в веб-браузере. (И страницы могут даже размещаться в браузере, если приложение является приложением XBAP.)
Мартин Ливерэйдж
6

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

Хорошее место для начала изучения здесь: http://windowsclient.net/learn

продавать
источник
5

Обычно мы используем One Main Windowдля приложения, а другие окна можно использовать в ситуациях, например, когда вам нужны всплывающие окна, потому что вместо использования всплывающих элементов управления в XAML, которые не видны, мы можем использовать окно, которое отображается во время разработки, так что это будет легко работать с

с другой стороны, мы используем много страниц для перехода с одного экрана на другой, например, экран управления пользователями на экран заказа и т. д. В главном окне мы можем использовать Frameэлементы управления для навигации, как показано ниже 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");
        }
    }

Это один из способов сделать это. Мы также можем использовать Tab Control вместо Fram и добавлять к нему страницы с помощью словаря при добавлении новой страницы, проверять, существует ли уже элемент управления, а затем только перемещаться, в противном случае добавлять и перемещаться. Я надеюсь это кому-то поможет

dnxit
источник
2

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

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

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

Hitesh
источник