全局停用FocusVisualStyle

时间:2009-06-28 20:25:51

标签: c# wpf styles

我想全局停用WPF应用程序中的焦点矩形。对于可以通过

完成的单个控件
<Style TargetType="Button">
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>

但是如何将它应用于我的应用程序中的所有控件。申请FrameworkElement时没有任何反应。我需要的是“适用于类x和所有派生类”。

提前致谢,

的Stefan

7 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

根据http://msdn.microsoft.com/en-us/library/bb613567.aspx,你应该能够像这样设置全局焦点样式:

<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate>
        <Rectangle StrokeThickness="1"
          Stroke="Black"
          StrokeDashArray="1 2"
          SnapsToDevicePixels="true"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style> 

我还没有测试过,但我想当你清空controltemplate时,这会有效地禁用整个应用程序的焦点矩形(如果你在app.xaml中包含这个样式)。

答案 2 :(得分:2)

我偶然发现了这个问题并提出了这个问题(确实不是很好但有效):

public class FocusVisualStyleRemover
{
  static FocusVisualStyleRemover()
  {
    EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.GotFocusEvent, new RoutedEventHandler(RemoveFocusVisualStyle), true);
  }

  public static void Init()
  {
    // intentially empty
  }

  private static void RemoveFocusVisualStyle(object sender, RoutedEventArgs e)
  {
    (sender as FrameworkElement).FocusVisualStyle = null;
  }
}

在我的MainWindow的构造函数中,我只需调用FocusVisualStyleRemover.Init();

答案 3 :(得分:1)

我知道这听起来很乏味,但你可能不得不为所有其他控件类型单独做同样的事情。制作一个列表并进行一些简单的查找/替换操作应该可以满足您的需求。

答案 4 :(得分:0)

这可能不简单,但您可以编写一个改变控件现有样式的函数。一旦编写完成,就可以编写一个递归改变每个元素样式的函数。

答案 5 :(得分:0)

您可以使用OverrideMetadata:

FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(null));
  1. 你必须在创建任何元素之前调用它,Application.Startup事件可能是最好的地方。
  2. 这只会影响使用FrameworkElement焦点视觉样式的控件,并且不会更改在代码或样式中覆盖它的控件。
  3. 我没有尝试使用FocusVisualStyle自己

答案 6 :(得分:0)

Template类的部分默认WindowAdornerDecorator。如果您覆盖Window的默认Template以不包含AdornerDecorator,则不会显示所有控件上的FocusVisualStyle

即使Control的有效FocusVisualStyle设置了Template,如果没有AdornerDecorator,它也不会显示。

实现此目的的一种简单方法是将此Style包含在Application.Resources下的App.xaml文件中。

<Style TargetType="{x:Type Window}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="ResizeMode" Value="CanResizeWithGrip">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                            <Grid>
                                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
                                <ResizeGrip x:Name="WindowResizeGrip" HorizontalAlignment="Right" IsTabStop="False" Visibility="Collapsed" VerticalAlignment="Bottom"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                                    <Condition Property="WindowState" Value="Normal"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
相关问题