Tutte le risposte finora implicano la sostituzione completa del comportamento predefinito del pulsante con qualcos'altro. Tuttavia, IMHO è utile e importante capire che è possibile cambiare solo la parte che ti interessa , modificando il modello predefinito esistente per un elemento XAML.
In caso di gestione dell'effetto al passaggio del mouse su un pulsante WPF, la modifica dell'aspetto in un Button
elemento WPF è causata da uno Trigger
stile predefinito per il Button
, che si basa sulla IsMouseOver
proprietà e imposta le proprietà Background
e dell'elemento di BorderBrush
primo livello Border
nel modello di controllo. Lo Button
sfondo dell'elemento si trova sotto lo Border
sfondo dell'elemento, quindi la modifica della Button.Background
proprietà non impedisce la visualizzazione dell'effetto al passaggio del mouse.
Con un po 'di sforzo, potresti ignorare questo comportamento con il tuo setter, ma poiché l'elemento che devi influenzare si trova nel modello e non è direttamente accessibile nel tuo XAML, quell'approccio sarebbe difficile e IMHO eccessivamente complesso.
Un'altra opzione potrebbe essere quella di utilizzare la grafica come Content
per il Button
piuttosto che come Background
. Se hai bisogno di contenuto aggiuntivo sulla grafica, puoi combinarli con un Grid
oggetto di primo livello nel contenuto.
Tuttavia, se vuoi letteralmente disabilitare completamente l'effetto hover (invece di nasconderlo), puoi usare la finestra di progettazione XAML di Visual Studio:
- Durante la modifica del codice XAML, seleziona la scheda "Progettazione" .
- Nella scheda "Design" , trova il pulsante per il quale desideri disattivare l'effetto.
- Fare clic con il pulsante destro del mouse e scegliere "Modifica modello / Modifica una copia ..." . Selezionare nel prompt che si ottiene dove si desidera posizionare la nuova risorsa modello. Questo sembrerà non fare nulla, ma in realtà il Designer avrà aggiunto nuove risorse dove le hai detto e cambiato il tuo elemento pulsante per fare riferimento allo stile che utilizza quelle risorse come modello di pulsante.
- Ora puoi modificare quello stile. La cosa più semplice è eliminare o commentare (es. Ctrl+ E, C) L'
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
elemento. Ovviamente, a quel punto puoi apportare qualsiasi modifica al modello che desideri.
Quando hai finito, lo stile del pulsante sarà simile a questo:
<p:Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<p:Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
</Trigger>-->
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
(Nota: puoi omettere le p:
qualifiche dello spazio dei nomi XML nel codice effettivo ... Le fornisco qui solo perché il formattatore di codice XML di Stack Overflow viene confuso da <Style/>
elementi che non hanno un nome completo con lo spazio dei nomi XML.)
Se desideri applicare lo stesso stile ad altri pulsanti, puoi semplicemente fare clic con il pulsante destro del mouse su di essi e scegliere "Modifica modello / Applica risorsa" e selezionare lo stile appena aggiunto per il primo pulsante. Puoi persino impostare tale stile come stile predefinito per tutti i pulsanti, utilizzando le normali tecniche per applicare uno stile predefinito agli elementi in XAML.
Forward-48.png
e attivare IsMouseOver per cambiarlo per lo stessoForward-48.png
. Sto provando a utilizzare il tuo codice con immagini diverse e ho funzionato bene.