Все ответы на данный момент включают полную замену поведения кнопки по умолчанию на что-то другое. Однако, IMHO, полезно и важно понимать, что можно изменить только ту часть, которая вам нужна , путем редактирования существующего шаблона по умолчанию для элемента XAML.
В случае работы с парения эффекта на кнопку WPF, изменение внешнего вида в WPF Button
элемента вызвано Trigger
в стиле по умолчанию для Button
, которое основано на IsMouseOver
собственности и устанавливает Background
и BorderBrush
свойства верхнего уровня Border
элемента в шаблоне управления. В Button
фоне элемента находится под Border
фоном элемента, поэтому изменение Button.Background
свойства не мешает эффект парения от просмотра.
Приложив некоторые усилия, вы можете переопределить это поведение с помощью своего собственного установщика, но поскольку элемент, на который вам нужно воздействовать, находится в шаблоне и не доступен напрямую в вашем собственном XAML, этот подход будет сложным и, по-моему, чрезмерно сложным.
Другой вариант - использовать графику в качестве Content
элемента, Button
а не элемента Background
. Если вам нужно дополнительное содержимое поверх рисунка, вы можете объединить их с Grid
объектом верхнего уровня в содержимом.
Однако, если вы буквально просто хотите полностью отключить эффект наведения (а не просто скрыть его), вы можете использовать конструктор XAML Visual Studio:
- При редактировании XAML выберите вкладку «Дизайн» .
- На вкладке «Дизайн» найдите кнопку, для которой вы хотите отключить эффект.
- Щелкните эту кнопку правой кнопкой мыши и выберите «Редактировать шаблон / Редактировать копию ...» . Выберите в приглашении, где вы хотите разместить новый ресурс шаблона. Будет казаться, что это ничего не делает, но на самом деле дизайнер добавит новые ресурсы туда, где вы ему сказали, и изменит ваш элемент кнопки, чтобы он ссылался на стиль, который использует эти ресурсы в качестве шаблона кнопки.
- Теперь вы можете редактировать этот стиль. Самый простой способ - удалить или закомментировать (например, Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
элемент. Конечно, на этом этапе вы можете внести в шаблон любые изменения.
Когда вы закончите, стиль кнопки будет выглядеть примерно так:
<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>
(Примечание: вы можете опустить p:
квалификацию пространства имен XML в фактическом коде ... Я привожу их здесь только потому, что средство форматирования кода XML Stack Overflow запутывается <Style/>
элементами, у которых нет полного имени с пространством имен XML.)
Если вы хотите применить тот же стиль к другим кнопкам, вы можете просто щелкнуть их правой кнопкой мыши, выбрать «Редактировать шаблон / Применить ресурс» и выбрать стиль, который вы только что добавили для первой кнопки. Вы даже можете сделать этот стиль стилем по умолчанию для всех кнопок, используя обычные методы применения стиля по умолчанию к элементам в XAML.
Forward-48.png
и запустить IsMouseOver, чтобы изменить его на то же самоеForward-48.png
. Я пытаюсь использовать ваш код с разными изображениями, и у меня все работает нормально.