0

Web サイトのナビゲーション バーのように、WPF で再利用可能なナビゲーション スタイルのカスタム コントロールを作成しようとしています。アプリ内のすべてのメイン ページへのリンクが含まれます。このコントロールは、NavigationWindow 内のすべてのページの上に配置できます。Web サイトのように、ページ全体で一貫したルック アンド フィールを提供します。

私の問題は、現在のページのリンクを他のページのリンクとは異なるスタイルにすることです。これにより、すぐにそれを見て、どのページにいるのかがわかります。コントロールは各ページで同じであるため、どのページが「アクティブ」であるかを伝え、適切にリンクするようにスタイルを設定する必要があります。

私が最初に考えたのは、Is<Page>Active プロパティを各ページに 1 つずつコントロールに配置し、そのページで適切なプロパティを true に設定することでした。(または、多くのプロパティを持つ代わりに、Enum 値を受け入れる 1 つのプロパティを使用することもできます)

例:

<local:Header IsHomePageActive="True" />

ヘッダー カスタム コントロールのコントロール テンプレートで、このプロパティを監視する DataTrigger を作成できます。

<Style.Triggers>
  <DataTrigger Binding="{Binding RelativeSource FindAncestor, AncestorType={x:Type local:Header}}, Path=IsHomePageActive}" Value="true">
    <Setter ... />
    <Setter ... />
    <Setter ... />
  </DataTrigger>
</Style>

そのすべての背景の後、ここに私の質問があります。 これは機能しますが、トリガーは 1 つのリンクにのみ適用される「IsHomePageActive」プロパティを直接参照する必要があるため、DataTrigger とその中のすべての Setter を複製する必要があります。そのため、実際の STYLE がまったく同じであるにもかかわらず (つまり、Setter は同じです)、リンクごとに異なる Style が必要です。唯一の違いは、トリガーが監視しているプロパティです。

何百行もの XAML が重複してしまうことなく、これを行う方法 (または同じ最終結果を持つもの) はありますか?

4

1 に答える 1

1

リストボックス(たとえば)をマスターとして、ページを詳細として、マスター/詳細パターン()を使用するのはどうですか。

次に、リストで選択したアイテムのスタイルを指定します。

別のリスト項目が選択されるとページが変わり、他の項目とは異なって表示されます。

Page が UserControl から継承し、使用できる文字列 Title を持つ List Pages などの依存関係プロパティがある場合

        <ListBox
                 ItemsSource="{Binding Pages}"
                 IsSynchronizedWithCurrentItem="true">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Title}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <ScrollViewer VerticalScrollBarVisibility="Auto"
                      Content="{Binding Pages/}" />

次に、リストボックスで選択したアイテムのスタイルを設定するだけです

于 2009-03-28T05:24:52.860 に答える