211

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

私のオプションは

  • ページ
  • UserControl

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

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

4

5 に答える 5

373

Windowオブジェクトはその名の通り、アプリケーションにとって新しいオブジェクトWindowです。まったく新しいウィンドウをポップアップ表示する場合に使用する必要があります。Windowユーザーのアクションに基づいて変化するメイン ウィンドウに動的コンテンツを配置することを好むため、WPF で複数使用することはあまりありません。

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

UserControlは、他のコントロールを追加するのと同じ方法で UI に追加できる再利用可能なユーザー作成コントロールです。通常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>

スクリーンショット1 スクリーンショット2

于 2012-08-31T13:11:55.837 に答える
14
  • Windowは のようなものなWindows.Forms.Formので、新しいウィンドウだけです
  • オンラインドキュメントによると、ページは次のとおりです。

    Windows Internet Explorer、NavigationWindow、および Frame でナビゲートおよびホストできるコンテンツのページをカプセル化します。

    したがって、基本的には、HTML コンテンツを視覚化する場合にこれを使用します。

  • UserControlは、再利用可能なコンポーネント (スタンドアロンのものではない) を作成して、複数の異なるコンポーネントで使用する場合に使用します。Windows

于 2012-08-30T21:58:50.097 に答える
7

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

探索を開始するのに適した場所は、http ://windowsclient.net/learn です。

于 2012-08-30T21:59:28.387 に答える
6

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

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

Fram の代わりにタブ コントロールを使用し、ディクショナリを使用してページを追加することもできます。コントロールが既に存在するかどうかを確認し、それ以外の場合は移動するだけです。それが誰かを助けることを願っています

于 2013-08-28T09:35:01.803 に答える
2

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

ユーザー コントロール: http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx

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

于 2013-05-25T10:40:26.853 に答える