全局停用FocusVisualStyle

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

   

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

提前致谢,

斯特凡

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

  

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

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

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

 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();

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

您可以使用OverrideMetadata:

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

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

即使Control具有设置Template的有效FocusVisualStyle ,也不会在没有AdornerDecorator情况下AdornerDecorator

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