Todas as respostas até agora envolvem a substituição completa do comportamento do botão padrão por outra coisa. No entanto, IMHO é útil e importante entender que é possível alterar apenas a parte de seu interesse , editando o modelo padrão existente para um elemento XAML.
No caso de lidar com o efeito de foco em um botão WPF, a mudança na aparência em um Button
elemento WPF é causada por um Trigger
no estilo padrão de Button
, que é baseado na IsMouseOver
propriedade e define as propriedades Background
e BorderBrush
do Border
elemento de nível superior no modelo de controle. O Button
plano de fundo do elemento está abaixo Border
do plano de fundo do elemento, portanto, alterar a Button.Background
propriedade não impede que o efeito de foco seja visto.
Com algum esforço, você pode substituir esse comportamento por seu próprio configurador, mas como o elemento que você precisa afetar está no modelo e não está diretamente acessível em seu próprio XAML, essa abordagem seria difícil e IMHO excessivamente complexa.
Outra opção seria usar o gráfico como Content
para o em Button
vez de Background
. Se precisar de conteúdo adicional sobre o gráfico, você pode combiná-los com um Grid
como o objeto de nível superior no conteúdo.
No entanto, se você literalmente quiser apenas desabilitar totalmente o efeito de foco (em vez de apenas ocultá-lo), você pode usar o Visual Studio XAML Designer:
- Ao editar seu XAML, selecione a guia "Design" .
- Na guia "Design" , encontre o botão para o qual deseja desativar o efeito.
- Clique com o botão direito nesse botão e escolha "Editar modelo / Editar uma cópia ..." . Selecione no prompt que você obtém onde deseja que o novo recurso de modelo seja colocado. Isso parecerá não fazer nada, mas na verdade o Designer terá adicionado novos recursos onde você disse e alterado o elemento do botão para fazer referência ao estilo que usa esses recursos como o modelo do botão.
- Agora, você pode editar esse estilo. A coisa mais fácil é excluir ou comentar (por exemplo , Ctrl+ E, C) o
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
elemento. Claro, você pode fazer qualquer alteração no modelo que desejar nesse ponto.
Quando terminar, o estilo do botão será mais ou menos assim:
<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>
(Observação: você pode omitir as p:
qualificações de namespace XML no código real ... Eu as forneço aqui apenas porque o formatador de código Stack Overflow XML fica confuso com <Style/>
elementos que não têm um nome totalmente qualificado com namespace XML.)
Se você quiser aplicar o mesmo estilo a outros botões, basta clicar com o botão direito neles e escolher "Editar modelo / Aplicar recurso" e selecionar o estilo que acabou de adicionar para o primeiro botão. Você pode até tornar esse estilo o estilo padrão para todos os botões, usando as técnicas normais para aplicar um estilo padrão a elementos em XAML.
Forward-48.png
e acionar o IsMouseOver para alterá-la da mesma formaForward-48.png
. Estou tentando usar o seu código com imagens diferentes e tudo funcionou bem.