全局停用FocusVisualStyle
我想在我的WPF应用程序中全局停用焦点矩形。 对于可以通过的单个控件
但是如何将它应用于我的应用程序中的所有控件。 申请FrameworkElement时没有任何反应。 我需要的是“适用于类x和所有派生类”。
提前致谢,
斯特凡
看起来没有灵丹妙药:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/141c8bfa-f152-4f8a-aca0-3c3b5440d183
根据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));
- 你必须在创建任何元素之前调用它,Application.Startup事件可能是最好的地方。
- 这将仅影响使用FrameworkElement的焦点视觉样式的控件,并且不会更改在代码或样式中覆盖它的控件。
- 我自己没有尝试使用FocusVisualStyle
Window
类的默认Template
的一部分是AdornerDecorator
。 如果覆盖Window
的默认Template
以不包含AdornerDecorator
,则不会显示所有控件上的FocusVisualStyle
。
即使Control
具有设置Template
的有效FocusVisualStyle
,也不会在没有AdornerDecorator
情况下AdornerDecorator
。
一种简单的方法是将此Style
包含在Application.Resources
下的App.xaml文件中。