Стиль выделения MouseOver, возвращающийся к значению по умолчанию через секунду (вызвано Aero?) - PullRequest
1 голос
/ 30 октября 2008

Я пытался стилизовать свои ComboBox для соответствия остальному интерфейсу, но у меня проблемы с выделением IsMouseOver. Он подсвечивается цветом, который я определяю на секунду, а затем постепенно возвращается к цвету по умолчанию, что-то вроде крутого эффекта, но не того, что я собираюсь сделать. Вот мой стиль:

<Style TargetType="ComboBox">
    <Style.Triggers>
        <Trigger Property="ComboBox.IsMouseOver" Value="True">
            <Setter Property = "Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

Что я могу сделать, чтобы цвет фона оставался?

Ответы [ 2 ]

4 голосов
/ 31 октября 2008

Проблема действительно из-за шаблона по умолчанию для ComboBox. Если вы используете Reflector , чтобы открыть сборку PresentationFramework.Aero, вы можете взглянуть на класс ButtonChrome. Существует метод OnRenderMouseOverChanged, который скрывает красный фон.

Несмотря на то, что это большая работа, по крайней мере для ComboBox, вы, вероятно, захотите переопределить шаблон по умолчанию для ComboBox. Вы можете получить базовое представление о том, что такое Temlpate ComboBox, используя Показать мне шаблон или Смешать .

Вы можете использовать свой стиль для переопределения шаблона.

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <!-- Template Here -->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
0 голосов
/ 30 декабря 2015

Вы можете переопределить это поведение, получив копию шаблона по умолчанию из конструктора WPF Visual Studio, а затем в стиле ComboBoxReadonlyToggleButton закомментируйте раздел ButtonChrome и замените его границей. Вот ссылка на сайт, где я нашел решение - http://www.scriptscoop.net/t/d346cf01d844/c-c-wpf-combobox-mouse-over-color.html

Вот мой фрагмент кода

<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}">
  <Setter Property="OverridesDefaultStyle" Value="true"/>
  <Setter Property="IsTabStop" Value="false"/>
  <Setter Property="Focusable" Value="false"/>
  <Setter Property="ClickMode" Value="Press"/>
  <Setter Property="Background" Value="Transparent"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ToggleButton}">
        <!-- Replace the ButtonChrome - this eliminated the following
             problem:  When the mouse was moved over the ComboBox
             the color would change to the color defined in ___ but 
             then would  
             immediately change to the default Aero blue
             gradient background of 2 powder blue colors  - 
             Had to comment out the          
             below code and replace it as shown
             <Themes:ButtonChrome x:Name="Chrome" BorderBrush="                 {TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="true">
               <Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
                 <Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
               </Grid>
             </Themes:ButtonChrome>-->

         <!-- Here is the code to replace the ButtonChrome code -->
         <Border x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
           <Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
             <Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
           </Grid>
         </Border>
       <!-- End of code to replace the Button Chrome -->

Я также добавил немного кода, чтобы изменить цвет фона на DarkOrange - Этот код вошел в ControlTemplate (в разделе) для стиля для ComboBox.

<!-- Hover Code - Code that was added to change the ComboBox background 
     color when the use hovers over it with the mouse -->
<Trigger Property="IsMouseOver" Value="True">
   <Setter Property="Background" Value="DarkOrange"></Setter>
</Trigger>
<!-- Hover Code - End -->
...