Как удалить эффект мыши по умолчанию на кнопках WPF?
моя проблема заключается в том, что в WPF, когда я пытаюсь изменить цвет фона кнопки с помощью триггеров или анимации, эффект наведения мыши по умолчанию (серый с оранжевым свечением), кажется, имеет приоритет.
после обширных поисков я не знаю, как удалить этот эффект.
7 ответов:
вам нужно создать свой собственный шаблон кнопки, чтобы иметь полный контроль над внешним видом во всех состояниях. Вот это учебник.
это похоже на решение, упомянутое Марком хитом, но с не таким большим количеством кода, чтобы просто создать очень простую кнопку, без встроенной мыши над анимационным эффектом. Он сохраняет простое наведение мыши на эффект отображения границы кнопки в черном цвете. Стиль может быть вставлен в окно.Ресурсов или управления.Например, раздел ресурсов (как показано).
<UserControl.Resources> <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect --> <Style x:Key="MyButtonStyle" TargetType="Button"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Name="border" BorderThickness="1" Padding="4,2" BorderBrush="DarkGray" CornerRadius="3" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="Black" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <!-- usage in xaml --> <Button Style="{StaticResource MyButtonStyle}">Hello!</Button>
просто добавить очень простое решение, это было достаточно хорошо для меня, и я думаю решает проблему ОП. Я использовал решение в ответ за исключением обычного
Backgroundзначение вместо изображения.<Style x:Key="SomeButtonStyle" TargetType="Button"> <Setter Property="Background" Value="Transparent" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid Background="{TemplateBinding Background}"> <ContentPresenter /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>никаких повторных шаблонов, кроме принуждения
Backgroundвсегда бытьTransparentфон от шаблонной кнопки-наведение мыши больше не влияет на фон, как только это будет сделано. Очевидно, заменитьTransparentС любой желаемой значение.
Если кто-то не хочет переопределять шаблон Управления по умолчанию, то вот решение.
вы можете создать DataTemplate для кнопки, которая может иметь TextBlock, а затем вы можете написать триггер свойства на свойстве IsMouseOver, чтобы отключить эффект наведения мыши. Высота текстового блока и кнопки должна быть одинаковой.
<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20"> <Button.ContentTemplate> <DataTemplate> <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20"> <TextBlock.Style> <Style TargetType="TextBlock"> <Style.Triggers> <Trigger Property ="IsMouseOver" Value="True"> <Setter Property= "Background" Value="Black"/> </Trigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </DataTemplate> </Button.ContentTemplate> </Button>
у человека с маффином был очень простой ответ, который работал для меня.
чтобы добавить немного более конкретное направление, по крайней мере для VS 2013:
- щелкните правой кнопкой мыши элемент
- выберите Редактировать шаблон = > редактировать копию...
- Я выбрал "приложение" для того, где сохранить стиль
- отсюда вы можете напрямую редактировать приложения.xaml и увидеть интуитивно именованные свойства. Для моих целей, я просто RenderMouseOver= "False"
- затем в файл MainWindow.xaml или где бы ни был ваш графический интерфейс, вы можете вставить новый стиль в конце тега кнопки, например
... Style="{DynamicResource MouseOverNonDefault}"/>
расширение на ответ dodgy_coder, который добавляет поддержку..
- поддержание стиля кнопки WPF
добавлена поддержка IsSelected и hover, т. е. переключенная кнопка
<Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ButtonBase}"> <Border Name="border" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> <Condition Property="Selector.IsSelected" Value="False" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="#FFBEE6FD" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> <Condition Property="Selector.IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="#BB90EE90" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="False" /> <Condition Property="Selector.IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="LightGreen" /> </MultiTrigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="border" Property="Opacity" Value="0.95" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>примеры..
<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />
С помощью шаблона триггера:
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> <Setter Property="Background" Value="White"></Setter> ... <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="White"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
Comments