4

いくつかの操作を含むメイン画面と、最初の操作が完了してボタンを押すとアクセスする2番目の画面がある単純なアプリケーションがあります。画像を参照してください:

ここに画像の説明を入力してください

茶色の領域は固定された左側のメニューであり、常に同じ場所に表示されます。 青い領域は、画面が変わる画面です。 赤い領域は、WindowsFormsからMDIContainerをシミュレートしようとしています。

そのコンテナを次のようにシミュレートするにはどうすればよいですか?

  1. 左側の静的メニューを維持する

  2. いくつかのイベント/アクションのためにコンテンツを動的に変更しますか?

4

2 に答える 2

3

最良の方法は、最初にグリッドコントロールを使用して、次のようにコントロールをレイアウトすることです(Blamが提案したように)。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <!-- Menu control. (Whichever you see fit. The menu could be established 
         within this control, or you could use a custom UserControl depending
         on your needs.) -->
    <StackPanel />

    <!-- Content control -->
    <ContentPresenter Name="ContentHolder" 
                      Grid.Column="1" />
</Grid>

デザインパターンに応じて、コンテンツを希望どおりに表示する方法がいくつかあります。

MVVMを使用している場合は、次のように、ContentPresenterコントロールをメインウィンドウのデータコンテキストのViewModelにバインドできます。

    <ContentPresenter Name="ContentHolder" 
                      Grid.Column="1"
                      Content="{Binding ContentData}" /> 

そして、対応するプロパティがViewModelに存在します。たとえば、次のようになります。

    public ViewModelBase ContentData{
      get { return _contentData; }
    }

それがあなたにとってギリシャ語が多い場合は、おそらくMVVMをデザインパターンとして使用していません。その場合、メインウィンドウクラスの背後にあるコードは、イベントハンドラーを使用してContentPresenterのコンテンツの設定を処理できます。

イベントハンドラーの要点は次のようになります。

    public void HandleNavigationChange(SwitchCondition sc){
      UserControl newContent = null;

      switch (sc) {
        case SwitchCondition.NavigationItem1:
          newContent = new NavigationItem1();
          break;

        case SwitchCondition.NavigationItem1:
          newContent = new NavigationItem1();
          break;
        //ETC
      }

      ContentHolder.Content = newContent;
    }

次に、メニュー項目のクリックから、または必要に応じて子コントロールからこのメソッドを呼び出すことができます。

于 2013-01-14T20:38:44.367 に答える
2
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Text="Static"/>
    <ContentControl x:Name="content1" Grid.Row="0" Grid.Column="1" Visibility="Visible" >
        <StackPanel>
            <TextBlock Text="One" />
            <Button Click="btn1_click" Content="Button1"/>
        </StackPanel>
    </ContentControl>
    <ContentControl x:Name="content2" Grid.Row="0" Grid.Column="1" Visibility="Hidden" >
        <StackPanel>
            <TextBlock Text="Two" />
            <Button Click="btn2_click" Content="Button2"/>
        </StackPanel>
    </ContentControl>
</Grid>

        private void btn1_click(object sender, RoutedEventArgs e)
        {
            content1.Visibility = System.Windows.Visibility.Hidden;
            content2.Visibility = System.Windows.Visibility.Visible;
        }

        private void btn2_click(object sender, RoutedEventArgs e)
        {
            content1.Visibility = System.Windows.Visibility.Visible;
            content2.Visibility = System.Windows.Visibility.Hidden;
        }

メニュー領域のように上のボタンを配置できる場合
フレームとページのコンテンツで動的な処理を実行できます
この例は、ページコンストラクタにデータを渡すことを示しています
nextPageはページ
もUserControlである可能性があります

<Frame Name="SrchItemEditField" />

PageDocFieldDetail nextPage = new PageDocFieldDetail(df);
SrchItemEditField.Content = nextPage;
于 2013-01-14T18:29:55.197 に答える