WPFのスタイルアクティブな項目
-
22-08-2019 - |
質問
私は、ウェブサイト上のナビゲーションバーのように、を再利用可能なナビゲーションスタイルWPFでののカスタムコントロールを作成しようとしています。それは私のアプリ内のすべての主要なページへのリンクが含まれています。このコントロールは、私のNavigationWindowにすべての私のページの一番上に行くことができます。ウェブサイトのような、素敵な一貫性のある外観を与え、ページ間で感じています。
あなたはすぐにそれを一瞥し、あなたがにしているどのページ見ることができるように、私の問題は、異なった他のページのリンクより、現在のページのリンクをスタイリングです。コントロールが各ページに同じであるので、私は「アクティブ」であるページにそれを伝え、それが適切にそのリンクのスタイルを持っている必要があります。
私が最初に考えたのは、単に場所は、コントロールの<ページ>アクティブな特性です各ページに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>
すべてその背景の後、ここで私の質問です。の。のこれは動作しますが、私はので、私が持っているすべての単一のページのために、その中のすべてのセッターをDataTriggerことを複製しているつもり、としていますトリガーは、直接1つのリンクのみに適用される「IsHomePageActive」プロパティを参照する必要があります。だから私は、その記述は、実際のSTYLEは(私が意味するこれによって、セッターが同じである)と全く同じであっても、すべてのリンクに異なるスタイルを必要としています。唯一の違いは、トリガーが見ているものの特性である。
重複XAMLの行数百人で終わることなく、いくつかのこれを行う方法(または同じ最終結果で何かが)ありますか?
解決
どのようにマスター/詳細パターンを使用しておよそ()リストボックス(例えば)との詳細など、マスターとあなたのページなど。
次に、リストで選択した項目について、あなたのスタイルを指定します。
別のリスト項目が選択されたときにページが変更され、それが他の項目に異なります。
あなたは、このようなページは、UserControlから継承し、使用できる文字列のタイトルを持っている一覧ページとして依存関係プロパティを持っている場合は、
<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/}" />
それからちょうどリストボックスで選択した項目のスタイルを設定する