0

我正在尝试在 WPF 中创建可重用的导航样式自定义控件,例如网站上的导航栏。它将包含指向我的应用程序中所有主要页面的链接。这个控件可以放在我的 NavigationWindow 中的所有页面之上。在页面之间提供一致的外观和感觉,例如网站。

我的问题是当前页面链接的样式与其他页面的链接不同,这样您就可以快速浏览它并查看您所在的页面。由于每个页面上的控件都是相同的,我需要告诉它哪个页面是“活动的”,并让它适当地设置该链接的样式。

我的第一个想法是简单地将 Is<Page>Active 属性放在控件上,每个页面一个,然后在页面上将相应的属性设置为 true。(或者我可以使用一个接受 Enum 值的属性,而不是拥有许多属性,无论哪种方式)

例子:

<local:Header IsHomePageActive="True" />

现在在我的 Header Custom Control 的控件模板中,我可以创建一个监视此属性的 DataTrigger:

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

在所有这些背景之后,这是我的问题。 这可行,但我将不得不为我拥有的每个页面复制该 DataTrigger 以及其中的所有 Setter,因为触发器必须直接引用仅适用于一个链接的“IsHomePageActive”属性。所以我需要为每个链接使用不同的样式,即使它描述的实际样式完全相同(我的意思是,设置器是相同的)。唯一的区别是触发器正在监视什么属性。

有没有办法做到这一点(或具有相同最终结果的东西),而不会以数百行重复的 XAML 结束?

4

1 回答 1

1

如何使用主/细节模式(),列表框(比如)作为主,你的页面作为细节。

然后为列表中的选定项目指定您的样式。

The page will change when a different list item is selected and it will look different to the other items.

如果您有一个依赖属性,例如 List Pages 其中 Page 继承自 UserControl 并且有一个字符串 Title 您可以使用

        <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 回答