2016-03-04 3 views
2

Следующий код создает окно с listboxitems, которые получают оранжевый, когда вы помещаете курсор пунктов:неправильные цвета в приложении WPF в Windows Server 2012

<Window x:Class="Orange.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 

    <Window.Resources> 
     <Style TargetType="ListBoxItem"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Orange" /> 
       </Trigger> 
       </Style.Triggers> 
      </Style> 
    </Window.Resources> 

    <ListBox> 
     <ListBoxItem> aaaa </ListBoxItem> 
     <ListBoxItem> aaaa </ListBoxItem> 
     <ListBoxItem> aaaa </ListBoxItem> 
    </ListBox> 
</Window> 

Если выполнить его на любой ОС, но ОС Windows 2012 Сервер работает правильно. На Windows 2012 Server фон отображается белым.

enter image description here

Любые идеи?

+0

Ну, это странно. Что, если вы попробуете прямое шестнадцатеричное значение для цвета, например # F90? –

ответ

2

Я использую Windows 10 (версия 1511), и он также не работает в моей системе.

Я использовал структуру документа VS 2015 для создания шаблона для ListBoxItem. Я изменил его для оранжевого фона, и он работает на Win10 (и, я полагаю, Server 2012).

<Window x:Class="WpfApplication20.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <Window.Resources> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> 
          <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="Orange"/> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="#A826A0DA"/> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="False"/> 
            <Condition Property="IsSelected" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="#3DDADADA"/> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="#FFDADADA"/> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="True"/> 
            <Condition Property="IsSelected" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="#3D26A0DA"/> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="#FF26A0DA"/> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <ListBox> 
     <ListBoxItem>aaaa</ListBoxItem> 
     <ListBoxItem>aaaa</ListBoxItem> 
     <ListBoxItem>aaaa</ListBoxItem> 
    </ListBox> 
</Window> 

Посмотрите, как есть триггер для IsMouseOver и что он устанавливает фон на границе, чтобы в закодированное значение? Вот почему ваш стиль не работает ... фон, вероятно, меняется, но граница не использует его! Используя Snoop, я вижу, что фон ListBoxItem действительно имеет оранжевый цвет, но, как я уже сказал, фон использует цвет в триггере шаблона.

Возможно, вам нужно создать стиль, а затем отбросить другие его стили. Я использовал VS 2013 на своей Win7 VM для создания базового шаблона, который должен быть близок к тому, что ожидают ваши существующие стили. Поместите это в app.xaml:

<Style TargetType="ListBoxItem"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
       <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> 
        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="True"/> 
          <Condition Property="Selector.IsSelectionActive" Value="False"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/> 
        </MultiTrigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

А затем изменить стили должны быть основан от его, как это:

<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="Orange" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Надеется, что это помогает ... не может быть идеальными, но он должен работать ,

+0

Приятно знать. Я не пробовал с Windows 10. В любом случае, я надеюсь, что смогу найти решение, которое не связано с изменением кода. У нас есть тонны пользовательских стилей, поскольку приложение разработано для обеспечения богатого UX. –

+0

Mmmm, звучит как ошибка для меня. Как вы думаете, я должен заполнить его в M $? –

+0

Вы могли бы, но я думаю, что эта проблема началась с Windows 8, поэтому я уверен, что они знают. Вы пробовали его в Windows 8? Сервер 2012 основан на Win 8, поэтому я думаю, что это не сработает. –

 Смежные вопросы

  • Нет связанных вопросов^_^