Semua jawaban sejauh ini melibatkan penggantian sepenuhnya perilaku tombol default dengan yang lain. Namun, IMHO berguna dan penting untuk dipahami bahwa mungkin saja mengubah hanya bagian yang Anda pedulikan , dengan mengedit template default yang ada untuk elemen XAML.
Dalam kasus menangani efek hover pada tombol WPF, perubahan tampilan dalam Button
elemen WPF disebabkan oleh Trigger
gaya default untuk Button
, yang didasarkan pada IsMouseOver
properti dan menyetel properti Background
dan BorderBrush
dari Border
elemen tingkat atas di template kontrol. The Button
latar belakang elemen adalah di bawah Border
latar belakang elemen, sehingga mengubah Button.Background
properti tidak mencegah efek hover dari yang terlihat.
Dengan sedikit usaha, Anda dapat menimpa perilaku ini dengan penyetel Anda sendiri, tetapi karena elemen yang perlu Anda pengaruhi ada di templat dan tidak langsung dapat diakses di XAML Anda sendiri, pendekatan itu akan sulit dan IMHO terlalu rumit.
Pilihan lain adalah menggunakan grafik sebagai Content
untuk Button
daripada Background
. Jika Anda membutuhkan konten tambahan di atas grafik, Anda dapat menggabungkannya dengan a Grid
sebagai objek tingkat atas dalam konten.
Namun, jika Anda benar-benar hanya ingin menonaktifkan efek hover sepenuhnya (bukan hanya menyembunyikannya), Anda dapat menggunakan Visual Studio XAML Designer:
- Saat mengedit XAML Anda, pilih tab "Desain" .
- Pada tab "Design" , cari tombol yang ingin Anda nonaktifkan efeknya.
- Klik kanan tombol itu, dan pilih "Edit Template / Edit Salinan ..." . Pilih di prompt yang Anda tuju di mana Anda ingin sumber daya template baru ditempatkan. Ini akan tampak tidak melakukan apa-apa, tetapi pada kenyataannya Perancang akan menambahkan sumber daya baru di mana Anda memberi tahu, dan mengubah elemen tombol Anda untuk merujuk gaya yang menggunakan sumber daya tersebut sebagai templat tombol.
- Sekarang, Anda bisa mengedit gaya itu. Hal termudah adalah menghapus atau mengomentari (mis. Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
Elemen. Tentu saja, Anda dapat membuat perubahan apa pun pada template yang Anda inginkan pada saat itu.
Setelah selesai, gaya tombol akan terlihat seperti ini:
<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>
(Catatan: Anda dapat menghilangkan p:
kualifikasi namespace XML dalam kode sebenarnya ... Saya menyediakannya di sini hanya karena pemformat kode XML Stack Overflow menjadi bingung oleh <Style/>
elemen yang tidak memiliki nama yang sepenuhnya memenuhi syarat dengan namespace XML.)
Jika Anda ingin menerapkan gaya yang sama ke tombol lain, Anda dapat mengklik kanan tombol tersebut dan memilih "Edit Template / Terapkan Sumber Daya" dan pilih gaya yang baru saja Anda tambahkan untuk tombol pertama. Anda bahkan dapat menjadikan gaya tersebut sebagai gaya default untuk semua tombol, menggunakan teknik normal untuk menerapkan gaya default ke elemen di XAML.
Forward-48.png
dan memicu IsMouseOver untuk mengubahnya untuk hal yang samaForward-48.png
. Saya mencoba menggunakan kode Anda dengan gambar yang berbeda dan semuanya bekerja dengan baik.