我有一个带有一些按钮的UserControl。我的按钮具有默认的FocusVisualStyle(按钮周围的边框)。
当我使用鼠标移动用户控件时,此虚线边框不会随之移动。当您将鼠标悬停在屏幕的另一部分上时,它会移动到正确的位置。
我不想将FocusVisualStyle设置为null,因为我需要查看关注的元素。我试图创建自己的FocusVisualStyle,但它的行为与默认的一样。
我可以以某种方式将此边框与其余元素同步吗?
感谢您的帮助
答案 0 :(得分:2)
如bitbonk所述,RenderTransform不会导致另一个排列传递,因此焦点视觉效果不会移动。您可以阅读this Dr. WPF article,其中讨论了该问题并提供了一些解决方法。最简单的方法是在UserControl中围绕UserControl的内容放置一个AdornerDecorator,以便也可以移动AdornerLayer。
答案 1 :(得分:0)
当您使用RenderTransform
时,FocusVisualStyle
矩形不随按钮移动,因为它在布局过程中呈现。这就是RenderTransform
的重点:转换任何视觉效果并忽略视觉树其余部分的布局。
您必须使用LayoutTransform
或Button.Margin
或Canvas.Left
,Canvas.Top
移动按钮。
答案 2 :(得分:0)
MSDN的这段(有些神秘的)摘录说明了这个问题的更一般形式:
焦点视觉样式专门用于键盘焦点。因此,焦点视觉样式是一种可访问性功能。如果您希望通过鼠标,键盘或编程方式对任何类型的焦点进行UI更改,则不应使用焦点视觉样式,而应在使用常规焦点属性值的样式或模板中使用setter和触发器例如IsFocused或IsFocusWithin。
今天,关于使用触发器的最后一点可能会更好地替换为您使用Visual State Manager的建议。这是一些以这种方式执行的XAML,但也保留了Button
的{{1}}的原始设置。当设置从键盘接收焦点时,该设置在FocusVisualStyle
内绘制一个虚线矩形两个像素。对于Button
和Storyboard
视觉状态,我的Focused
s会在Unfocused
内添加和删除一个实心矩形,只要它因任何原因获得或失去焦点。
如果您在WPF窗口中创建一对Button
并通过键盘和鼠标操作焦点,使用空格键和鼠标单击Button
,您将看到Button
没有出现时,Button
通常会有焦点。同样,这(根据上面的摘录)是设计的。 (我很困惑这是一个“辅助功能”,因为它很容易忽略,以显示下次空格键被按下时将点击哪个控件。我倾向于根本不使用它。)
注意:以下代码适用于源自FocusVisualStyle
的自定义控件,称为“Button
”。如果您不想创建自定义控件来尝试此操作,则可以将XLButton
的{{1}}更改为Style
。
TargetType