Pencere vs Sayfa vs WPF navigasyon için UserControl?


192

Şu anda bir masaüstü uygulaması yazıyorum, ancak birini uygulamanın yeni bir bölümüne yönlendirirken ne kullanacağımı kafamda bulamıyorum.

Seçeneklerim

  • pencere
  • Sayfa
  • Kullanıcı kontrolü

ama aralarındaki farkın ne olduğunu ve her birini ne zaman kullanmam gerektiğini anlamıyorum.

Birisi benim için farklılıkları açıklayabilir ve her birini hangi durumlar / uygulamalar için kullanabileceğinize bir örnek verebilir mi?

Yanıtlar:


337

Bir Window nesnesi tam olarak göründüğü gibidir: Windowuygulamanız için yeni bir özelliktir. Tamamen yeni bir pencere açmak istediğinizde kullanmalısınız. WindowWPF'de sık sık birden fazla kullanmıyorum çünkü ana pencereme kullanıcı işlemlerine göre değişen dinamik içerik koymayı tercih ediyorum.

Bir Sayfa senin pencere içinde bir sayfadır. Çoğunlukla tek bir tarayıcı pencerenizin olduğu ve farklı sayfaların o pencerede barındırılabildiği XBAP gibi web tabanlı sistemler için kullanılır. Ayrıca sellmeadog gibi Navigasyon Uygulamalarında kullanılabilir dedi .

Bir UserControl Eğer kullanıcı arayüzüne başka kontrolünü eklersiniz aynı şekilde ekleyebileceğiniz yeniden kullanılabilir bir kullanıcı tarafından oluşturulan kontrolüdür. Genellikle UserControlbazı özel işlevsellik (örneğin, a CalendarControl) oluşturmak istediğinizde veya ViewMVVM tasarım desenini kullanırken olduğu gibi ilgili XAML kodunun büyük bir miktarına sahip olduğumda bir oluşturuyorum.

Pencereler arasında gezinirken yeni bir Windownesne oluşturabilir ve onu gösterebilirsiniz.

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

ama bu cevabın başında söylediğim gibi, mümkünse birden fazla pencereyi yönetmemeyi tercih ederim.

Tercih ettiğim gezinme yöntemim, a kullanarak bazı dinamik içerik alanı oluşturmak ContentControlve bunu UserControlgeçerli görünümün bulunduğu bir içerikle doldurmaktır .

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

ve navigasyon etkinliğinizde bunu kullanarak

ContentArea.Content = new MyUserControl();

Ancak WPF ile çalışıyorsanız, MVVM tasarım desenini şiddetle tavsiye ederim. Blogumda , bu kalıbı kullanarak MVVM kullanarak nasıl gezineceğinizi gösteren çok temel bir örneğim var:

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

Screenshot1 Screenshot2


Bir sorum var, söyleyebileceğim MVVM veri kümeleri ile iyi çalışıyor gibi görünüyor, ama örneğin bir denetim için bir giriş formu gibi statik formlar hakkında ne. Statik sayfalar için bir sayfa mı yoksa kullanıcı kontrolü mü kullanmalıyım?
Herrozerro

2
@Herrozerro MVVM kullanarak bir Denetim formu yapmak istersem AuditViewModel, form için tüm verileri ve işlevselliği içeren bir dosyaya sahip olacaktım ve bunu bir AuditViewUserControl veya yalnızca birDataTemplate
Rachel

1
Teşekkürler! Aslında blogunuzu ve birkaç siteyi inceledikten sonra MVVM'nin nasıl çalıştığını daha iyi anladım.
Herrozerro

1
@Herrozerro ViewModeltipik için inşa edilmiştir Viewiken Modelsuygulamanız tarafından kullanılan veri nesneleri ve sınıfları ( "yapıtaşları") vardır ( ViewModels)
Rachel

1
@ GTS13 Evet Bunu sık sık yapıyorum. Ben TabControl.ItemsSourcebir nesne koleksiyonuna bağlamak ve DataTemplates kullanarak WPF nasıl her sekme üzerinde her nesne türü çizmek için. Gibi Genellikle şey bu
Rachel

13
  • Pencere gibi Windows.Forms.Form, bu yüzden sadece yeni bir pencere
  • Sayfa , çevrimiçi belgelere göre :

    Windows Internet Explorer, NavigationWindow ve Frame'e gidip barındırılabilecek bir içerik sayfası içerir.

    Yani temelde bazı HTML içeriğini görselleştiriyorsanız

  • UserControl , birkaç farklı bileşende kullanmak için yeniden kullanılabilir bir bileşen (bağımsız bileşen değil) oluşturmak istediğiniz durumlar içindirWindows


Cevabınız için teşekkür ederim. Örneğin, solda düğmeler olan bir uygulama oluşturuyorsanız ancak sağ tarafta bu düğmelerin içindeki içeriği görmek istiyorsanız bir kullanıcı kontrolü mü kullanacaksınız?
Steve

@Steve: UserControlbu pencerede kullanacağınız aynı kontrol setini düşündüğünüzde kullanın, başka bir pencerede de kullanacaksınız, bu yüzden çift kod yazmak yerine, sadece bir oluşturun UserControl, ancak değilse, Verilerinizi Windowkendisi üzerinde, sağ taraftaki düğmelerden sağ tarafta.
Tigran

6
Ben eklenmelidir düşünüyorum bir öğe daha vardır: DataTemplates. Bunlar, WPF'ye belirli bir kapsamdaki bir öğenin nasıl çizileceğini söylemek istediğinizde kullanılır. Örneğin, Buttonsyuvarlak daireler olarak çizmek isterseniz , a DataTemplateyerine bir kullanabilirsiniz UserControl. Genellikle UserControlskendi işlevselliği ile yeni bir kontrol istediğimde ya da tek bir bileşen için çok fazla XAML olduğunda, örneğin View. Herhangi bir özel işlevsellik gerektirmeyen daha küçük XAML bitleri için, bir DataTemplateoluşturmak yerine kullanmalısınızUserControl
Rachel

3
Genel olarak a'nın içeriği PageHTML değil XAML'dir. Ancak, a Page, bir web tarayıcısında gezinmenin nasıl yapıldığına kavramsal olarak benzeyen gezinme çerçevesine bağlanır. (Uygulama bir XBAP uygulaması ise sayfalar bir tarayıcıda bile barındırılabilir.)
Martin Liversage

6

Her şey oluşturmaya çalıştığınız uygulamaya bağlıdır. Windowİletişim kutusu tabanlı bir uygulama oluşturuyorsanız s'yi kullanın . Navigasyon tabanlı bir uygulamaPage oluşturuyorsanız s'yi kullanın . s, Windows ve Sayfalar'da kullanabileceğiniz yönlerden bağımsız olarak faydalı olacaktır.UserControl

Keşfetmeye başlamak için iyi bir yer: http://windowsclient.net/learn


5

WindowUygulama için genellikle bir ana kullanırız ve diğer pencereler pop-up'lara ihtiyacınız olduğu durumlarda kullanılabilir çünkü XAML'de görünür olmayan açılır pencereleri kullanmak yerine tasarım zamanında görülebilen bir pencere kullanabiliriz, böylece kolay olur birlikte çalışmak

Öte yandan biz kullanabilirsiniz ana Pencerede al Ekranı vb Kullanıcı yönetim ekranı gibi bir ekrandan diğerine geçebilme birçok sayfa kullanmak FrameXAML aşağıda gibi navigasyon için kontrol

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

Bunu yapmanın bir yolu Ayrıca, Kontrol zaten varsa yeni sayfa denetimi eklerken, bir Sözlük kullanarak Çerçeveleme ve Sayfa ekleme yerine Sekme Denetimi kullanabiliriz, aksi takdirde yalnızca ekleme ve gezinme işlemlerini gerçekleştirin. Umarım bu birine yardım eder


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.