WPF - FocusVisualStyle在移动

时间:2013-01-14 15:13:55

标签: wpf focusvisualstyle

我有一个带有一些按钮的UserControl。我的按钮具有默认的FocusVisualStyle(按钮周围的边框)。

当我使用鼠标移动用户控件时,此虚线边框不会随之移动。当您将鼠标悬停在屏幕的另一部分上时,它会移动到正确的位置。

我不想将FocusVisualStyle设置为null,因为我需要查看关注的元素。我试图创建自己的FocusVisualStyle,但它的行为与默认的一样。

我可以以某种方式将此边框与其余元素同步吗?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

如bitbonk所述,RenderTransform不会导致另一个排列传递,因此焦点视觉效果不会移动。您可以阅读this Dr. WPF article,其中讨论了该问题并提供了一些解决方法。最简单的方法是在UserControl中围绕UserControl的内容放置一个AdornerDecorator,以便也可以移动AdornerLayer。

答案 1 :(得分:0)

当您使用RenderTransform时,FocusVisualStyle矩形不随按钮移动,因为它在布局过程中呈现。这就是RenderTransform的重点:转换任何视觉效果并忽略视觉树其余部分的布局。

您必须使用LayoutTransformButton.MarginCanvas.LeftCanvas.Top移动按钮。

答案 2 :(得分:0)

MSDN的这段(有些神秘的)摘录说明了这个问题的更一般形式:

  

焦点视觉样式专门用于键盘焦点。因此,焦点视觉样式是一种可访问性功能。如果您希望通过鼠标,键盘或编程方式对任何类型的焦点进行UI更改,则不应使用焦点视觉样式,而应在使用常规焦点属性值的样式或模板中使用setter和触发器例如IsFocused或IsFocusWithin。

今天,关于使用触发器的最后一点可能会更好地替换为您使用Visual State Manager的建议。这是一些以这种方式执行的XAML,但也保留了Button的{​​{1}}的原始设置。当设置从键盘接收焦点时,该设置在FocusVisualStyle内绘制一个虚线矩形两个像素。对于ButtonStoryboard视觉状态,我的Focused s会在Unfocused内添加和删除一个实心矩形,只要它因任何原因获得或失去焦点。

如果您在WPF窗口中创建一对Button并通过键盘和鼠标操作焦点,使用空格键和鼠标单击Button,您将看到Button没有出现时,Button通常会有焦点。同样,这(根据上面的摘录)是设计的。 (我很困惑这是一个“辅助功能”,因为它很容易忽略,以显示下次空格键被按下时将点击哪个控件。我倾向于根本不使用它。)

注意:以下代码适用于源自FocusVisualStyle的自定义控件,称为“Button”。如果您不想创建自定义控件来尝试此操作,则可以将XLButton的{​​{1}}更改为Style

TargetType