【问题标题】:WPF Style Active ItemWPF 样式活动项
【发布时间】:2009-03-28 02:27:47
【问题描述】:

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

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

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

例子:

<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 以及其中的所有 Setter,因为触发器必须直接引用仅适用于一个链接的“IsHomePageActive”属性。所以我需要为每个链接使用不同的样式,即使它描述的实际样式完全相同(我的意思是,设置器是相同的)。唯一的区别是触发器正在监视什么属性。

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

【问题讨论】:

    标签: wpf custom-controls uinavigationbar


    【解决方案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/}" />
    

    然后只需为列表框上的选定项设置样式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2020-07-27
      • 2017-01-20
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多