На сьогодні всі відповіді передбачають повну заміну поведінки кнопки за замовчуванням чимось іншим. Однак IMHO корисно і важливо розуміти, що можна змінити лише ту частину, яка вам важлива , відредагувавши існуючий шаблон за замовчуванням для елемента XAML.
У разі роботи з ширяння ефекту на кнопку WPF, зміна зовнішнього вигляду в WPF Button
елемента викликано Trigger
в стилі за замовчуванням для Button
, яке засноване на IsMouseOver
власності і встановлює Background
і BorderBrush
властивості верхнього рівня Border
елемента у шаблоні управління. В Button
тлі елемента знаходиться під Border
фоном елемента, тому зміна Button.Background
властивості не заважає ефект польоту від перегляду.
Доклавши певних зусиль, ви можете замінити цю поведінку за допомогою власного сеттера, але оскільки елемент, на який вам потрібно впливати, знаходиться в шаблоні, а безпосередньо не доступний у вашому власному XAML, такий підхід буде складним, а IMHO надмірно складним.
Іншим варіантом було б використовувати графіку як Content
для, Button
а не як Background
. Якщо вам потрібен додатковий вміст над графікою, ви можете поєднати їх із Grid
об’єктом верхнього рівня у вмісті.
Однак, якщо ви буквально просто хочете повністю вимкнути ефект наведення (а не просто приховувати його), ви можете скористатися Visual Studio XAML Designer:
- Під час редагування 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="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>
(Примітка: ви можете опустити p:
кваліфікацію простору імен XML у фактичному коді ... Я надаю їх тут лише тому, що XML-програвач форматування коду XML заплутається <Style/>
елементами, які не мають повноцінного імені з простором імен XML.)
Якщо ви хочете застосувати той самий стиль до інших кнопок, ви можете просто клацнути їх правою кнопкою миші та вибрати «Редагувати шаблон / Застосувати ресурс» та вибрати стиль, який ви щойно додали для першої кнопки. Ви навіть можете зробити цей стиль типовим для всіх кнопок, використовуючи звичайні прийоми застосування стилю за замовчуванням до елементів у XAML.
Forward-48.png
і викликати IsMouseOver, щоб змінити його на те самеForward-48.png
. Я намагаюся використовувати ваш код з різними зображеннями, і я все працював чудово.