我想全局停用WPF应用程序中的焦点矩形。对于可以通过
完成的单个控件<Style TargetType="Button">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
但是如何将它应用于我的应用程序中的所有控件。申请FrameworkElement时没有任何反应。我需要的是“适用于类x和所有派生类”。
提前致谢,
的Stefan
答案 0 :(得分:3)
看起来没有灵丹妙药:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/141c8bfa-f152-4f8a-aca0-3c3b5440d183
答案 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));
答案 6 :(得分:0)
Template
类的部分默认Window
是AdornerDecorator
。如果您覆盖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>