it-swarm.com.ru

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

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

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

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

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

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

177
Steve

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

Страница - это страница в вашем окне. Он в основном используется для веб-систем, таких как 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

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

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

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

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

13
Tigran

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

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

5
sellmeadog

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

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

3
dnxit

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

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

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

2
Hitesh