【问题标题】:Office 2010 like list view items style?Office 2010 喜欢列表视图项目样式吗?
【发布时间】:2011-10-24 11:09:00
【问题描述】:


这是一个 Office 2010 列表视图,其项目样式...悬停和按下/选择。
如何在 WPF 列表视图项目中使用项目样式?
我的 UI 使用 Fluent Ribbon Control Suite,并且有正确的颜色。
我只是不知道如何将它们应用于ListViewItems。
请问一下,风格怎么弄?

编辑:我知道如何为元素设置样式...只是我不知道如何应用这种样式,因为它有点复杂。例如,有 2 个边框
我尝试在模板的每个边框中放置样式,但我无法(通过单个样式)找到该项目是否被选中。
我还尝试将TargetNames 放在项目的样式中,但错误提示我不能。

【问题讨论】:

    标签: c# wpf fluent listviewitem office-2010


    【解决方案1】:

    所以我在Style 中的Setter 中设置了Template 属性,并尝试绑定到其中的非ListViewItem 属性,并且成功了!

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <Border Background="{DynamicResource TransparentBrush}" BorderBrush="{DynamicResource TransparentBrush}" BorderThickness="1" CornerRadius="2" Height="Auto" HorizontalAlignment="Stretch" Name="border" VerticalAlignment="Stretch">
                    <Border Background="{DynamicResource TransparentBrush}" BorderBrush="{DynamicResource TransparentBrush}" BorderThickness="1" CornerRadius="2" Height="Auto" Name="border1">
                        <TextBlock Text="{Binding Path=FileName}" TextAlignment="Center" TextTrimming="CharacterEllipsis" Width="Auto" />
                    </Border>
                </Border>
    
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Border.BorderBrush" TargetName="border" Value="{DynamicResource ButtonPressedOuterBorderBrush}" />
                        <Setter Property="Border.Background" TargetName="border" Value="{DynamicResource ButtonPressedOuterBackgroundBrush}" />
                        <Setter Property="Border.Background" TargetName="border1" Value="{DynamicResource ButtonPressedInnerBackgroundBrush}" />
                        <Setter Property="Border.BorderBrush" TargetName="border1" Value="{DynamicResource ButtonPressedInnerBorderBrush}" />
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="UIElement.IsMouseOver" Value="True" />
                            <Condition Property="IsSelected" Value="False" />
                            <Condition Property="UIElement.IsEnabled" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Border.BorderBrush" TargetName="border1" Value="{DynamicResource ButtonHoverInnerBorderBrush}" />
                        <Setter Property="Border.Background" TargetName="border1" Value="{DynamicResource ButtonHoverInnerBackgroundBrush}" />
                        <Setter Property="Border.Background" TargetName="border" Value="{DynamicResource ButtonHoverOuterBackgroundBrush}" />
                        <Setter Property="Border.BorderBrush" TargetName="border" Value="{DynamicResource ButtonHoverOuterBorderBrush}" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="UIElement.IsKeyboardFocusWithin" Value="True" />
                            <Condition Property="IsSelected" Value="False" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Border.BorderBrush" TargetName="border1" Value="{DynamicResource ButtonHoverInnerBorderBrush}" />
                        <Setter Property="Border.Background" TargetName="border1" Value="{DynamicResource ButtonHoverInnerBackgroundBrush}" />
                        <Setter Property="Border.Background" TargetName="border" Value="{DynamicResource ButtonHoverOuterBackgroundBrush}" />
                        <Setter Property="Border.BorderBrush" TargetName="border" Value="{DynamicResource ButtonHoverOuterBorderBrush}" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    

    这里,FileName 属性(显然)不是 ListViewItem 的一部分,它是我放入 ListView 的类的一部分。它在第 6 行。

    对于那些想要这个主题的人,它就在那里,在ControlTemplate.Triggers
    我使用的资源(画笔)需要Fluent。我从Fluent.Button 的风格中获取它们。

    只需将 TextBlock 替换为您的数据模板即可! :)

    【讨论】:

      【解决方案2】:

      也许您不想重新发明轮子? http://www.devcomponents.com/blog/?p=581

      我使用这些组件,它们很漂亮。

      这里的重点是,这不是一项简单的任务。

      看看真正的按钮是如何制作的:http://msdn.microsoft.com/en-us/library/ms753328.aspx,你就会明白我的意思。

      【讨论】:

      • 没有商业内容。如果别人的轮子要花钱,我会重新发明轮子。对了,我为什么要看看真正的按钮是怎么做出来的?
      • 重点在于复杂性。具体来说,您需要设置比您确定的三个状态更多的样式。例如,禁用和默认。您还需要一些故事板——不仅仅是样式。所以这些商业按钮是不错的选择,因为它们看起来完全像你想要的那样。考虑您的时间与 300 美元的对比——但这取决于您。这里有一个想法,在 Blend 中打开试用版并提取它们的样式和模板。这将使您走得更远,并为您提供与您想要的非常相似的参考。祝你好运。
      • 我妈妈(我唯一的父母)每月赚 400 美元。我们(我、妈妈和我的兄弟)要不要饿几周,这样我才能买那个?
      • 这就是为什么我说从试用版中提取样式。
      • 最后,我从 Fluent 控件中提取了样式。
      【解决方案3】:

      使用ItemsControl.ItemContainerStyle 为您的项目定义样式,更改您可以使用Triggers 触发IsSelectedIsMouseOver 的那些状态的外观,最终如何实现这一特定结果是由你决定...

      【讨论】:

      • 我忘了说明为什么需要帮助。
      • @Vercas:我不太清楚,如果您想应用复杂的更改,您可以在触发器内的设置器中更改Template。你试过吗?
      • 我没有...我已经为我的项目创建了一个自定义模板,它实际上不是ListViewItems,它们是MyProgram.Data.Item,它甚至不是一个 UI 组件。但是,我会试试这个。听起来它可能会起作用!
      • 这真的是不可维护的......所以我尝试绑定到我的ControlTemplate 中的非ListViewItem 属性并且它起作用了。
      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多