WPF样式活动项目

时间:2009-03-28 02:27:48

标签: wpf custom-controls uinavigationbar

我正在尝试在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”属性,该属性仅适用于一个链接。所以我需要为每个链接使用不同的Style,即使它描述的实际STYLE完全相同(我的意思是,Setter是相同的)。唯一的区别是触发器正在观察的属性。

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

1 个答案:

答案 0 :(得分:1)

如何使用带有列表框(例如)的主/详细模式()作为主页,将您的页面用作详细信息。

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

当选择了不同的列表项时,页面将会改变,并且它与其他项目看起来不同。

如果你有一个依赖属性,比如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/}" />

然后只需为列表框中的所选项目设置样式