Wszystkie dotychczasowe odpowiedzi obejmują całkowite zastąpienie domyślnego zachowania przycisków czymś innym. Jednak IMHO jest przydatne i ważne, aby zrozumieć, że można zmienić tylko część, na której Ci zależy , edytując istniejący, domyślny szablon dla elementu XAML.
W przypadku do czynienia z efektem najechania na przycisk WPF, zmiana wyglądu w WPF Button
elementu spowodowany jest Trigger
w domyślnym stylu dla Button
, który opiera się na IsMouseOver
własności i ustawia Background
i BorderBrush
właściwości najwyższego poziomu Border
elementu w szablonie kontrolnym. Tego Button
elementu tła jest pod Border
elementu tła, więc zmieniając Button.Background
właściwość nie przeszkadza efekt najechania z widzianym.
Przy pewnym wysiłku można by zastąpić to zachowanie własnym ustawiaczem, ale ponieważ element, na który trzeba wpłynąć, znajduje się w szablonie i nie jest bezpośrednio dostępny we własnym XAML, takie podejście byłoby trudne i zbyt skomplikowane IMHO.
Inną opcją byłoby użycie grafiki jako elementu Content
for Button
zamiast Background
. Jeśli potrzebujesz dodatkowej zawartości zamiast grafiki, możesz połączyć je z obiektem Grid
najwyższego poziomu w treści.
Jeśli jednak chcesz po prostu całkowicie wyłączyć efekt najechania kursorem (zamiast go ukrywać), możesz użyć projektanta Visual Studio XAML:
- Edytując XAML, wybierz kartę „Projekt” .
- Na karcie „Projekt” znajdź przycisk, dla którego chcesz wyłączyć efekt.
- Kliknij ten przycisk prawym przyciskiem myszy i wybierz „Edytuj szablon / Edytuj kopię ...” . Wybierz w wyświetlonym monicie miejsce, w którym chcesz umieścić nowy zasób szablonu. Wydaje się, że to nic nie da, ale w rzeczywistości Projektant doda nowe zasoby tam, gdzie to powiedziałeś, i zmieni element przycisku, aby odwoływał się do stylu, który używa tych zasobów jako szablonu przycisku.
- Teraz możesz przejść do edycji tego stylu. Najłatwiej jest usunąć lub skomentować (np. Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
Element. Oczywiście w tym momencie możesz wprowadzić dowolną zmianę w szablonie.
Kiedy skończysz, styl przycisku będzie wyglądał mniej więcej tak:
<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="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>
(Uwaga: możesz pominąć p:
kwalifikacje przestrzeni nazw XML w rzeczywistym kodzie… Podaję je tutaj tylko dlatego, że program formatujący kod XML przepełnienia stosu jest zdezorientowany przez <Style/>
elementy, które nie mają w pełni kwalifikowanej nazwy z przestrzenią nazw XML.)
Jeśli chcesz zastosować ten sam styl do innych przycisków, możesz po prostu kliknąć je prawym przyciskiem myszy i wybrać „Edytuj szablon / Zastosuj zasób” i wybrać styl, który właśnie dodałeś do pierwszego przycisku. Możesz nawet ustawić ten styl jako domyślny styl dla wszystkich przycisków, używając zwykłych technik stosowania stylu domyślnego do elementów w języku XAML.
Forward-48.png
i wyzwolić IsMouseOver, aby zmienić go na to samoForward-48.png
. Próbuję użyć twojego kodu z różnymi obrazami i wszystko działało dobrze.