WPFナビゲーションのウィンドウvsページvsユーザーコントロール?


192

私は現在デスクトップアプリケーションを書いていますが、誰かをアプリケーションの新しいセクションにリダイレクトするときに何を使用するか頭を悩ませているようです。

私のオプションは

  • ページ
  • UserControl

しかし、それらの違いが何であるか、そしてそれぞれをいつ使用するべきかはわかりません。

誰かが私のために違いを説明して、それぞれにどのような状況/アプリケーションを使用することができるかの例を挙げてもらえますか?

回答:


337

ウィンドウの新しい:オブジェクトは、それはのように聞こえるだけで何ですWindow、あなたのアプリケーションのために。まったく新しいウィンドウをポップアップする場合に使用します。Windowユーザーの操作に基づいて変化する動的なコンテンツをメインウィンドウに配置したいので、WPFで複数を使用することはあまりありません。

A ページは、あなたのウィンドウ内のページです。これは主に、XBAPなどのWebベースのシステムで使用されます。このシステムでは、単一のブラウザーウィンドウがあり、そのウィンドウでさまざまなページをホストできます。また、sellmeadogのようなナビゲーションアプリケーションでも使用できます。

A ユーザーコントロールは、あなたのUIにあなたが他のコントロールを追加するのと同じ方法を追加することができ、再利用可能なユーザーが作成したコントロールです。通常UserControl、いくつかのカスタム機能(たとえばCalendarControl)を組み込みたい場合、またはViewMVVM設計パターンを使用する場合など、関連するXAMLコードが大量にある場合に、を作成します。

ウィンドウ間を移動するときに、新しいWindowオブジェクトを作成して表示するだけです

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

しかし、この回答の冒頭で述べたように、可能であれば複数のウィンドウを管理しない方がよいでしょう。

私が推奨するナビゲーション方法は、を使用して動的コンテンツ領域を作成しContentControl、それにUserControl現在のビューが何であれを含むを設定することです。

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

そしてあなたのnavigateイベントではあなたはそれを使ってそれを設定する

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

2
@Herrozerro MVVMを使用して監査フォームを作成したい場合、フォームのAuditViewModelすべてのデータと機能を含むを作成し、AuditViewUserControlまたは単にDataTemplate
Rachel

1
ありがとう!実際、あなたのブログや他のいくつかのサイトを調べたところ、MVVMがどのように機能するかをよく理解できました。
Herrozerro 2013年

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自体、つまり、ボタンの右側にあります。
Tigran 2012

6
追加すべき項目がもう1つありますDataTemplates。これらは、特定のスコープ内でアイテムを描画する方法をWPFに伝えたい場合に使用されます。たとえば、Buttons丸い円になるように描画したい場合は、のDataTemplate代わりにを使用できますUserControl。私は通常UserControls、独自の機能を持つ新しいコントロールが必要な場合、またはのように単一のコンポーネントに多くのXAMLがある場合に使用しViewます。特別な機能を必要としない小さなXAMLの場合、DataTemplate作成する代わりにを使用する必要がありますUserControl
Rachel

3
一般に、aのコンテンツはPageHTMLではなくXAMLです。ただし、Pageはナビゲーションフレームワークに関連付けられており、Webブラウザでナビゲーションを行う方法と概念的に似ています。(アプリケーションがXBAPアプリケーションの場合、ページをブラウザーでホストすることもできます。)
Martin Liversage 2012

6

すべては、構築しようとしているアプリに依存します。Windowダイアログベースのアプリを構築する場合は、sを使用します。ナビゲーションベースのアプリをPage構築する場合は、sを使用します。sは、WindowsとPagesの両方で使用できるので、方向に関係なく便利です。UserControl

探索を始めるのに適した場所はこちらです:http : //windowsclient.net/learn


5

通常Window、アプリケーションにはOne Main を使用し、ポップアップが必要な場合などの状況では他のウィンドウを使用できます。XAMLで表示されないポップアップコントロールを使用する代わりに、設計時に表示されるウィンドウを使用して簡単にできるためです。一緒に働く

一方、ユーザー管理画面から注文画面などのように、1つの画面から別の画面に移動するために多くのページを使用しますメインウィンドウでは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");
        }
    }

これはその方法の1つです。Framの代わりにタブコントロールを使用し、辞書を使用してページに追加することもできます。新しいページを追加するときに、コントロールが既に存在するかどうかを確認し、それ以外の場合はナビゲートし、それ以外の場合は追加してナビゲートするだけです。それが誰かを助けることを願っています


2

何よりも正解を投稿しています。あなたがそれらを参照し、同じことについて明確でより良いアイデアを持つことができるように、いくつかのリンクを追加したいと思います。

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

WPFに関するページとウィンドウの違い:WPFのページとウィンドウ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.