我认为最好的方法可能取决于您拥有哪些可聚焦元素?如果您想要针对listboxitem执行此操作,您可以仅使用xaml来执行如下操作:
<UserControl.Resources>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Selector.IsSelected" Value="True"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ListBox>
<ListBoxItem>
Blah
</ListBoxItem>
</ListBox>
同样的风格触发器也可以应用于其他可聚焦和可选择的元素上。
修改选项卡停靠点上的虚线就可以了。那个破折号表示被选中状态,所以它已经被选中了。这个“选择焦点元素”的语句没有任何意义,因为如果你正在指的是选项卡停靠点,它已经被选中了。您可以通过按Tab键,然后查看哪个按钮有点线,并按Enter键来测试它是否会执行Click事件(如果在其后面有处理程序,则会执行)。
您需要的是这个。
如果您想要在代码背后完成,请将此添加到XAML资源中。
<Style x:Key="MyFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="-2" StrokeThickness="1" Stroke="Blue" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
....
myButton.FocusVisualStyle = (Style)FindResource("MyFocusVisual");
我会确保每个元素都是按钮或按钮的模板。这样就可以使用“IsTabStop”,或者可以将元素聚焦。 使用MrsEd的解决方案,您可以正确地为项目添加边框:
<Button x:Class="Visualisation.UserControlButtonImage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
IsTabStop="True">
<Button.Template>
<ControlTemplate>
<Grid>
<Image/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
在xml中,我将PreviewGotKeyboardFocus添加到我的窗口中。
PreviewGotKeyboardFocus="FrmBase_OnPreviewGotKeyboardFocus"
使用 PreviewGotKeyboardFocus 在根元素(用户控件或窗口)上处理每个子控件的焦点事件。
代码后台
private void FrmBase_OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
try
{
dynamic item = e.NewFocus;
item.IsSelected = true;
}
catch (Exception ex)
{
}
}
protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
var focusedElement = e.Source as IInputElement;
// Do something here
}
IsFocused
设置为 true,还是只是希望元素看起来像是被聚焦了? - DomyseeFocusManager
来管理所选内容。另外,由于焦点一次只能在一个控件上,因此一次只能选择一个项目。 - Kcvin