web-dev-qa-db-ja.com

ウィンドウ対ページ対WPFナビゲーションのためのUserControl?

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

私のオプションは

  • ページ
  • UserControl

しかし、私はそれらの違いが何であるか、そしていつ私がそれぞれを使うべきか理解していません。

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

177
Steve

Windowオブジェクトはまさにそのようなものです。あなたのアプリケーションのための新しいWindowです。全く新しいウィンドウをポップアップしたいときにそれを使うべきです。私は、WPFで複数のWindowを使用することはあまりありません。ユーザーの操作に応じて変化する動的コンテンツをメインウィンドウに配置したいからです。

Aページはウィンドウ内のページです。これは主にXBAPのようなWebベースのシステムに使用されます。ここでは単一のブラウザウィンドウがあり、そのウィンドウでさまざまなページをホストできます。 Navigation Applications like sellmeadogによる でも使えます。

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

ウィンドウ間を移動するときは、新しい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>

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

通常はアプリケーションに1つのメインウィンドウを使用し、ポップアップが必要な場合など、他のウィンドウを使用できます。これは、表示されない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");
        }
    }

その方法の1つです。Framの代わりにタブコントロールを使用し、辞書を使用して新しいページを追加しながらコントロールを追加することもできます。それが誰かに役立つことを願っています

3
dnxit

すべてのほとんどが正しい答えを投稿しました。私はいくつかのリンクを追加したいのです。そうすれば、あなたがそれらを参照することができ、そして同じことについて明確でより良いアイディアを持つことができます:

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

WPFに関するページとウィンドウの違いは、次のとおりです。 WPFのPage vs Window?

2
Hitesh