Подтвердить что ты не робот

Список/Combo Box Background и выбранные цвета в .net 4.5

У меня есть приложение, которое успешно работает на Windows 7 и ниже, ориентируясь на .NET Framework.
Если приложение теперь установлено в 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>
4b9b3361

Ответ 1

Я забыл вернуться с тем, как я решил это... Оказывается, все, что вам нужно сделать, создает пустой стиль контейнера предметов и назначает его вашему списку /combobox и т.д.... Вы можете использовать это как а также сохранить текущий стиль, который вы можете использовать, например 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>

Ответ 2

Ваше приложение переопределяет значение SystemColors.HighlightBrushKey(и других системных ключей). Это работает для элементов управления, которые определяют цвета переднего и заднего фона, ссылаясь на системные цвета, как в теме по умолчанию Win7 (Aero).
Но тема по умолчанию для Win8 (Aero2) определяет цвета по-разному. Таким образом, ваше переопределение не влияет.

Темы не требуют использования системных цветов. Это произошло в Win7/Aero, но только потому, что системные цвета считались адекватными.

Надеюсь, что это поможет.

Ответ 3

Перечитывая документацию для 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

Ответ 4

Он называется темой по умолчанию, которая зависит от системы, вы на самом деле не должны ее использовать. Вы можете переписать его целиком, установив еще один Control.Template.

Ответ 5

<Style.Triggers>
                <Trigger Property="IsSelected" Value="true">
                    <Setter Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect Color="Red"
                              BlurRadius="0"
                              ShadowDepth="0" />
                        </Setter.Value>
                    </Setter>
                </Trigger>

Ответ 6

Вот то, что я придумал, не связано с изменением системных цветов или шаблонов управления. Просто оберните 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>

Затем просто используйте оболочку UserControl, как если бы это был ListBox. Любые другие свойства ListBox, которые вы хотите контролировать, можно просто добавить в оболочку таким же образом, как ItemsSource и SelectedItem из моего примера.