Как мне остановить Vista от пульсации моих сфокусированных кнопок XAML? - PullRequest
2 голосов
/ 18 мая 2009

Я создал стиль для кнопок в своем приложении WPF.

Однако в Vista, когда кнопка находится в фокусе, она пульсирует голубым , что не очень хорошо выглядит в дизайне.

Как мне переопределить этот автоматический пульс?

<Style x:Key="NavigationButtonStyle" TargetType="Button">
    <Setter Property="Width" Value="400"/>
    <Setter Property="Height" Value="100"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="FontSize" Value="56"/>
    <Setter Property="Foreground" Value="#aaa"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="#ddd" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="True">
            <Setter Property="Foreground" Value="#aaa" />
        </Trigger>
    </Style.Triggers>
</Style>

Попробовал "IsFocused":

Добавление этого не влияет на Vista, кнопка по-прежнему выглядит так же и пульсирует в Vista, когда фокусируется:

<Trigger Property="IsFocused" Value="True">
    <Setter Property="Background" Value="Red" />
    <Setter Property="Foreground" Value="Blue" />
</Trigger>

Пробное решение "ControlTemplate":

По-прежнему не действует:

<Style x:Key="ButtonFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle SnapsToDevicePixels="true" Margin="2" Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="NavigationButtonStyle" TargetType="Button">
    <Setter Property="Width" Value="400"/>
    <Setter Property="Height" Value="100"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="FontSize" Value="56"/>
    <Setter Property="Foreground" Value="#aaa"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="#ddd" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="True">
            <Setter Property="Foreground" Value="#aaa" />
        </Trigger>
    </Style.Triggers>
</Style>

Ответы [ 3 ]

1 голос
/ 18 мая 2009

Этот эффект устанавливается в ответе IsKeyboardFocused, а не только на стандартный фокус.

В Blend, если вы измените шаблон элемента управления для стандартной кнопки, вы увидите, что за этот эффект отвечает триггер IsKeyboardFocused = true.

<Style x:Key="Button_NonGlow" TargetType="{x:Type Button}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
        <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <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}">
                    <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}">
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
                    </Microsoft_Windows_Themes:ButtonChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsKeyboardFocused" Value="true">
                            <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="ToggleButton.IsChecked" Value="true">
                            <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#ADADAD"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
0 голосов
/ 05 февраля 2013

В зависимости от ваших конкретных требований вы можете просто убедиться, что кнопка не получает фокус клавиатуры, установив IsTabStop = "False" и IsDefault = "False".

0 голосов
/ 18 мая 2009

То, что вы ищете, это свойство триггера IsFocused. Извините, что у меня нет рабочего примера для вас прямо здесь.


UPDATE:

Я нашел этот маленький кусочек кода, который когда-то использовал. Я не уверен, что работает, и я не могу проверить его (я на XP box):

<Style x:Key="ButtonFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle SnapsToDevicePixels="true" Margin="2" Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type Button}">
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
</Style>    
...