Şimdiye kadarki tüm cevaplar, varsayılan düğme davranışını tamamen başka bir şeyle değiştirmeyi içeriyor. Ancak IMHO , bir XAML öğesi için mevcut, varsayılan şablonu düzenleyerek yalnızca ilgilendiğiniz bölümü değiştirmenin mümkün olduğunu anlamak yararlı ve önemlidir .
Bir WPF düğmesindeki fareyle üzerine gelme etkisinin ele alınması durumunda, bir WPF Button
öğesindeki görünümdeki değişikliğe , özelliği temel alan ve en üst düzey öğenin ve özelliklerini ayarlayan Trigger
varsayılan stildeki bir neden olur. kontrol şablonunda. Öğenin arka plan altında olduğunu değişiyor, böylece öğenin arka özelliği görülmesini hover efekti engellemez.Button
IsMouseOver
Background
BorderBrush
Border
Button
Border
Button.Background
Biraz çaba sarf ederek, bu davranışı kendi ayarlayıcınızla geçersiz kılabilirsiniz, ancak etkilemeniz gereken öğe şablonda olduğundan ve kendi XAML'inizde doğrudan erişilebilir olmadığından, bu yaklaşım zor ve IMHO aşırı karmaşık olacaktır.
Başka bir seçenek olarak grafiği kullanmak yapmak olacaktır Content
için Button
yerine Background
. Grafik üzerinde ek içeriğe ihtiyacınız varsa, bunları içerikte Grid
en üst düzey nesne olarak bir ile birleştirebilirsiniz .
Ancak, kelimenin tam anlamıyla yalnızca üzerine gelme efektini tamamen devre dışı bırakmak istiyorsanız (yalnızca gizlemek yerine), Visual Studio XAML Tasarımcısı'nı kullanabilirsiniz:
- XAML'inizi düzenlerken, "Tasarım" sekmesini seçin.
- In "Tasarım" sekmesine, bu durumun etkili devre dışı bırakmak istediğiniz düğmeyi bulun.
- Bu düğmeye sağ tıklayın ve "Şablonu Düzenle / Bir Kopyasını Düzenle ..." seçeneğini seçin . Yeni şablon kaynağının yerleştirilmesini istediğiniz yere ulaştığınız bilgi isteminde seçin. Bu hiçbir şey yapmıyor gibi görünecek, ancak aslında Tasarımcı söylediğiniz yerde yeni kaynaklar eklemiş ve düğme öğenizi, bu kaynakları düğme şablonu olarak kullanan stile başvurmak için değiştirmiş olacaktır.
- Şimdi gidip bu stili düzenleyebilirsiniz. En kolay şey, öğeyi silmek veya yorumlamaktır (örneğin Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
. Elbette, bu noktada şablonda istediğiniz değişikliği yapabilirsiniz.
İşiniz bittiğinde düğme stili şuna benzer:
<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>
(Not: p:
XML ad alanı niteliklerini gerçek kodda atlayabilirsiniz … Bunları burada sağlıyorum çünkü Yığın Taşması XML kod biçimlendiricisi <Style/>
XML ad alanıyla tam olarak nitelenmiş bir ada sahip olmayan öğelerle karıştırılır .)
Aynı stili diğer düğmelere de uygulamak istiyorsanız, yalnızca sağ tıklayıp "Şablonu Düzenle / Kaynağı Uygula" yı seçip ilk düğme için eklediğiniz stili seçebilirsiniz. XAML'deki öğelere varsayılan bir stil uygulamak için normal teknikleri kullanarak, bu stili tüm düğmeler için varsayılan stil bile yapabilirsiniz.
Forward-48.png
ve aynı şekilde değiştirmek için IsMouseOver'ı tetiklemeniz gerekirForward-48.png
. Kodunuzu farklı resimlerle kullanmaya çalışıyorum ve her şey yolunda gitti.