Вікно проти сторінки проти UserControl для навігації по WPF?


192

Зараз я пишу настільний додаток, але, здається, не можу зрозуміти, що використовувати, коли переспрямовувати когось до нового розділу програми.

Мої варіанти, здається, є

  • Вікно
  • Сторінка
  • UserControl

але я не розумію, в чому різниця між ними, і коли я повинен використовувати кожен.

Чи може хтось пояснити мені відмінності та навести приклад того, для яких ситуацій / застосувань ви можете використовувати кожне?

Відповіді:


337

Вікно об'єкт тільки те , що це звучить як: його нове Windowдля вашого застосування. Ви повинні використовувати його, коли ви хочете спливати абсолютно нове вікно. Я не часто використовую більше ніж один Windowу WPF, тому що я вважаю за краще розміщувати динамічний контент у своєму головному вікні, який змінюється на основі дії користувача.

Сторінка є сторінкою всередині вікна. В основному він використовується для таких веб-систем, як XBAP, де у вас є одне вікно браузера, і в цьому вікні можуть розміщуватися різні сторінки. Він також може бути використаний у навігаційних програмах, як, наприклад, sellmeadog .

UserControl є багаторазовим створений користувачем елемент управління , який ви можете додати в свій користувальницький інтерфейс так само , як ви б додати будь-який інший елемент керування. Зазвичай я створюю те, UserControlколи я хочу вбудувати якусь власну функціональність (наприклад, a 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>

Скріншот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, тож просто нове вікно
  • Сторінка , згідно з онлайн-документацією :

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

    Таким чином, ви в основному використовуєте це, якщо будете візуалізувати деякий HTML-вміст

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


Спасибі за вашу відповідь. Так, наприклад, якщо ви створювали додаток, у якому ліворуч були кнопки, але ви хотіли бачити вміст цих кнопок з правого боку, ви б користувались контролем користувача?
Стів

@Steve: використовуйте UserControlу тому випадку, коли ви вважаєте, що той самий набір елементів управління, який ви будете використовувати в цьому вікні, ви будете використовувати і на якомусь іншому, тому замість написання подвійного коду просто створіть UserControl, але якщо ні, просто поставте елементи керування для візуалізації ваші дані про Windowсебе, на правій стороні від згаданих вами кнопок.
Тигран

6
Там ще один пункт , який я думаю , повинен бути доданий: DataTemplates. Вони використовуються, коли ви хочете сказати WPF, як намалювати елемент у певних межах. Наприклад, якщо ви хочете намалювати Buttonsкруглі кола, ви можете просто використовувати DataTemplateзамість UserControl. Зазвичай я використовую, UserControlsколи я хочу новий елемент управління з його власним функціоналом або коли у мене є багато XAML для одного компонента, наприклад для a View. Для менших бітів XAML, які не потребують особливих функціональних можливостей, слід використовувати DataTemplateзамість створенняUserControl
Rachel

3
Взагалі вміст а Pageне HTML, а XAML. Тим не менш, a Pageприв’язаний до навігаційної системи, яка концептуально схожа на те, як здійснюється навігація у веб-браузері. (І сторінки можуть розміщуватися навіть у веб-переглядачі, якщо програма є додатком XBAP.)
Martin Liversage

6

Все залежить від програми, яку ви намагаєтеся створити. Використовуйте Windows, якщо ви створюєте додаток на основі діалогу. Використовуйте Pages, якщо ви створюєте додаток для навігації .UserControls буде корисно незалежно від напрямку, яким ви рухаєтесь, оскільки ви зможете використовувати їх як у Windows, так і на Сторінках.

Хороше місце для початку вивчення тут: 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 і додавати сторінки до нього за допомогою словника, додаючи перевірку нової сторінки, якщо елемент керування вже існує, тоді лише навігація додавати та переходити в іншому випадку. Я сподіваюся, що комусь допоможу


2

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

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

Різниця між сторінкою та вікном щодо WPF: Сторінка проти Вікна у WPF?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.