MouseOver soulignant le style revenant à la valeur par défaut après une seconde (Caused by Aero?)

StackOverflow https://stackoverflow.com/questions/250622

Question

J'essayais de personnaliser mes ComboBox pour les faire correspondre au reste de l'interface utilisateur, mais j'ai des problèmes avec la mise en surbrillance IsMouseOver. Il est mis en surbrillance avec la couleur que je spécifie pendant une seconde, puis revient à la couleur par défaut, un effet plutôt cool, mais pas ce que je recherche. Voici mon style:

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

Que puis-je faire pour conserver la couleur de fond?

Était-ce utile?

La solution

Le problème est en effet dû au modèle par défaut pour le ComboBox. Si vous utilisez Reflector pour ouvrir l'assembly PresentationFramework.Aero, vous pouvez consulter la classe ButtonChrome. Il existe une méthode appelée OnRenderMouseOverChanged qui masque l’arrière-plan rouge.

Même si cela demande beaucoup de travail, pour ComboBox au moins, vous voudrez probablement remplacer le modèle par défaut pour le ComboBox. Vous pouvez obtenir une idée de base du temlpate de ComboBox en utilisant Montrez-moi le Modèle ou Fusion .

Vous pouvez utiliser votre même style pour remplacer le modèle.

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <!-- Template Here -->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Autres conseils

Vous pouvez redéfinir ce comportement en récupérant une copie du modèle par défaut auprès de WPF Visual Studio Designer, puis dans le style ComboBoxReadonlyToggleButton commentez la section ButtonChrome et remplacez-la par une bordure. Voici un lien vers le site où j'ai trouvé la solution - http://www.scriptscoop.net/t/d346cf01d844/cc-wpf-combobox-mouse-over-color.html

Voici mon extrait de code

<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 -->

J'ai aussi ajouté du code pour changer la couleur de fond en DarkOrange - Ce code est entré dans le ControlTemplate (dans la section) pour le style de la liste déroulante.

<!-- 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 -->
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top