14

我有一个应用程序在 Windows 7 及更低版本上运行良好,目标是 .net 4 框架。
如果该应用程序现在安装在 Windows 8 中(运行 .net 4.5 但仍以 .net 4 为目标),它会为列表框或组合框中的选定项目显示蓝色背景,并为焦点项目显示白色背景。有没有办法删除这个?
我在我的 XAML 中使用以下内容来设置有问题的样式,这似乎解决了 Windows 8 之前的问题。

<ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                    <Style.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/>
                    </Style.Resources>
                </Style>
            </ListBox.ItemContainerStyle>
4

6 回答 6

10

我忘了回来告诉我我是如何解决这个问题的......原来你需要做的就是创建一个空白的项目容器样式并将它分配给你的列表框/组合框等......你可以使用它以及保持您可能正在使用的当前样式,例如 ListBox Style="{StaticResource CurrentStyle}" ItemContainerStyle="{StaticResource BlankListBoxContainerStyle}" /> 其中 BlankListBoxContainerStyle 类似于.....

<Style x:Key="BlankListBoxContainerStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="FocusVisualStyle"
            Value="{x:Null}"/>
</Style>
于 2012-12-03T17:16:42.857 回答
6

您的应用程序会覆盖 SystemColors.HighlightBrushKey(和其他系统键)的值。这适用于通过引用系统颜色来定义其前景色/背景色的控件,就像它们在 Win7 默认主题 (Aero) 中所做的那样。
但是 Win8 默认主题 (Aero2) 对颜色的定义不同。所以你的覆盖没有效果。

主题不需要使用系统颜色。他们碰巧在 Win7/Aero 中这样做了,但这只是因为系统颜色被认为是足够的。

希望这可以帮助。

于 2012-08-22T21:12:35.057 回答
4

重新阅读 frameworkcompatibility 的文档,我发现在为 .NET 4 编译并在 Windows 8 上运行时实际上不需要它。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkcompatibilitypreferences%28v=vs.110%29.aspx

但是我仍然有 Windows 7 中不存在的蓝色背景,我最终将问题追溯到一个列表视图,该列表视图的样式与我的列表框不同。我发现我实际上并不需要为元素选择元素的能力,因此将列表视图更改为项目控件解决了我的问题。

也可以看看:

http://connect.microsoft.com/VisualStudio/feedback/details/750655/selected-listboxitem-does-not-have-a-background-of-controlbrushkey-when-app-is-unfocused

于 2012-08-28T20:09:02.437 回答
0

它被称为依赖于系统的默认主题,你并不是真的要搞砸它。您可以通过设置另一个Control.Template.

于 2012-08-17T14:45:23.200 回答
0
<Style.Triggers>
                <Trigger Property="IsSelected" Value="true">
                    <Setter Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect Color="Red"
                              BlurRadius="0"
                              ShadowDepth="0" />
                        </Setter.Value>
                    </Setter>
                </Trigger>
于 2014-02-19T21:56:37.240 回答
0

这是我想出的不涉及更改系统颜色或控制模板的方法。只需将 ListBox 包装在一个新的 UserControl 中。

public partial class StyledListBox : UserControl
{
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public object SelectedItem
    {
        get { return GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }

    public StyledListBox()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(StyledListBox), new FrameworkPropertyMetadata(null));
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(StyledListBox), new FrameworkPropertyMetadata(null));

    public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(StyledListBox), new FrameworkPropertyMetadata(null)
    {
        BindsTwoWayByDefault = true,
        DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
    });
}

XAML:

<UserControl x:Class="StyledListBox"

     <ListBox ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type common:StyledListBox}}}"
              SelectedItem="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type common:StyledListBox}}}">

        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border>
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
                                             Value="True">
                                    <Setter Property="Background" Value="Red" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>

                    <ContentPresenter ContentTemplate="{Binding ItemTemplate, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StyledListBox}}}" />
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</UserControl>

然后只需像使用 ListBox 一样使用包装器 UserControl。您想要控制的任何其他 ListBox 属性都可以简单地以ItemsSourceSelectedItem我的示例相同的方式添加到包装器中。

于 2015-01-30T14:31:10.403 回答