Bei allen bisherigen Antworten wird das Standardverhalten der Schaltflächen vollständig durch etwas anderes ersetzt. IMHO ist es jedoch nützlich und wichtig zu verstehen, dass es möglich ist, nur den Teil zu ändern, der Ihnen wichtig ist , indem Sie die vorhandene Standardvorlage für ein XAML-Element bearbeiten.
Wenn Sie sich mit dem Hover-Effekt auf einer WPF-Schaltfläche befassen, wird die Änderung des Erscheinungsbilds in einem WPF- Button
Element durch a Trigger
im Standardstil für das verursacht Button
, der auf der IsMouseOver
Eigenschaft basiert und die Background
und BorderBrush
Eigenschaften des Border
Elements der obersten Ebene festlegt in der Kontrollvorlage. Der Button
Hintergrund des Border
Elements befindet sich unter dem Hintergrund des Elements. Wenn Sie also die Button.Background
Eigenschaft ändern , wird der Hover-Effekt nicht sichtbar.
Mit etwas Aufwand könnten Sie dieses Verhalten mit Ihrem eigenen Setter überschreiben. Da sich das zu beeinflussende Element jedoch in der Vorlage befindet und in Ihrer eigenen XAML nicht direkt verfügbar ist, wäre dieser Ansatz schwierig und meiner Meinung nach zu komplex.
Eine andere Möglichkeit wäre, die Grafik eher Content
für die Button
als für die zu verwenden Background
. Wenn Sie zusätzlichen Inhalt über die Grafik benötigen, können Sie diese mit einem Grid
Objekt der obersten Ebene im Inhalt kombinieren .
Wenn Sie den Hover-Effekt jedoch buchstäblich nur vollständig deaktivieren möchten (anstatt ihn nur auszublenden), können Sie den Visual Studio XAML Designer verwenden:
- Wählen Sie beim Bearbeiten Ihrer XAML die Registerkarte "Design" .
- In der „Design“ Registerkarte finden Sie die Schaltfläche für den Sie den Effekt deaktivieren möchten.
- Klicken Sie mit der rechten Maustaste auf diese Schaltfläche und wählen Sie "Vorlage bearbeiten / Kopie bearbeiten ..." . Wählen Sie in der Eingabeaufforderung aus, wo die neue Vorlagenressource platziert werden soll. Dies scheint nichts zu bewirken, aber tatsächlich hat der Designer neue Ressourcen hinzugefügt, wo Sie es gesagt haben, und Ihr Schaltflächenelement geändert, um auf den Stil zu verweisen, der diese Ressourcen als Schaltflächenvorlage verwendet.
- Jetzt können Sie diesen Stil bearbeiten. Am einfachsten ist es , das Element zu löschen oder auskommentieren (z. B. Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
. Natürlich können Sie an dieser Stelle jede gewünschte Änderung an der Vorlage vornehmen.
Wenn Sie fertig sind, sieht der Schaltflächenstil ungefähr so aus:
<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>
(Hinweis: Sie können die p:
XML-Namespace-Qualifikationen im eigentlichen Code weglassen. Ich stelle sie hier nur zur Verfügung, weil der XML-Code-Formatierer für Stapelüberlauf durch <Style/>
Elemente verwechselt wird , die keinen vollständig qualifizierten Namen mit XML-Namespace haben.)
Wenn Sie denselben Stil auf andere Schaltflächen anwenden möchten, können Sie einfach mit der rechten Maustaste darauf klicken und "Vorlage bearbeiten / Ressource anwenden" auswählen und den Stil auswählen, den Sie gerade für die erste Schaltfläche hinzugefügt haben. Sie können diesen Stil sogar zum Standardstil für alle Schaltflächen machen, indem Sie die normalen Techniken zum Anwenden eines Standardstils auf Elemente in XAML verwenden.
Forward-48.png
und IsMouseOver auslösen, um es für dasselbe zu ändernForward-48.png
. Ich versuche, Ihren Code mit verschiedenen Bildern zu verwenden, und ich habe alle gut funktioniert.