gpt4 book ai didi

wpf - 将焦点矩形应用于子元素

转载 作者:行者123 更新时间:2023-12-04 23:53:15 25 4
gpt4 key购买 nike

在我目前正在处理的控件中,当某个项目获得焦点时,默认的焦点矩形会跨越整行及其所有可见的子项目。我知道如何隐藏它。但是当项目具有键盘焦点时,我仍然想要这样一个焦点指示器。我已经阅读了有关 IsKeyboardFocused 属性的信息,但当鼠标单击该项目时也是如此。所以我想我需要以某种方式使用 FocusVisualStyle。但我不知道该怎么做。

这是默认焦点的样子:

enter image description here

这就是它应该喜欢的:

enter image description here

这是我的控件模板的 XAML 代码:

<Border ...>
<ContentPresenter FocusManager.IsFocusScope="True"
Content="{TemplateBinding HeaderedContentControl.Header}"
ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
ContentSource="Header"
Name="PART_Header" .../>
</Border>
<!-- Additional border glare inside the item -->
<Border BorderThickness="1" BorderBrush="#80ffffff" Margin="1"
SnapsToDevicePixels="True" CornerRadius="2"/>
<!-- Focus rectangle inside the item -->
<Rectangle StrokeDashArray="1 2" StrokeThickness="1" Stroke="Black"
SnapsToDevicePixels="True" Margin="2"
Visibility="Hidden" Name="FocusRectangle"
FocusVisualStyle="{StaticResource FocusStyle}"/>

在我的 XAML 中已经有一个默认情况下不可见的焦点矩形。使用 FocusVisualStyle 或任何东西,它应该是可见的。但我没能做到。它要么在任何焦点处可见,要么从不可见。

最佳答案

我已经找到解决该问题的方法。它对我来说看起来是一样的,但我不完全确定这是否是的正确方法。我正在使用上面的 FocusRectangle 并自己关心显示和隐藏它。

这是管理焦点矩形可见性的触发器:

<!-- Show the focus rectangle when the item is focused -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Controls:TreeViewExItem.IsKeyboardMode" Value="True"/>
<Condition Property="Controls:TreeViewExItem.IsFocused" Value="True"/>
</MultiTrigger.Conditions>
<Setter TargetName="FocusRectangle" Property="Visibility" Value="Visible"/>
</MultiTrigger>

然后我向 TreeViewExItem 添加了一个新属性,指示最后一次输入是来自鼠标还是键盘。这可能会扩展到触控或手写笔,但我没有此类设备可以测试。

public static DependencyProperty IsKeyboardModeProperty =
DependencyProperty.Register(
"IsKeyboardMode",
typeof(bool),
typeof(TreeViewExItem),
new FrameworkPropertyMetadata(false, null));

public bool IsKeyboardMode
{
get
{
return (bool) GetValue(IsKeyboardModeProperty);
}
set
{
SetValue(IsKeyboardModeProperty, value);
}
}

此属性通过绑定(bind)从父控件传递到每个项目:

<!-- Pass on the TreeViewEx' IsKeyboardMode value to each item because
we couldn't access it otherwise in the triggers -->
<Setter Property="IsKeyboardMode"
Value="{Binding (Controls:TreeViewEx.IsKeyboardMode),
RelativeSource={RelativeSource
AncestorType={x:Type Controls:TreeViewEx}}, Mode=OneWay}" />

同样的 IsKeyboardMode 属性被添加到 TreeViewEx 父控件,我的魔法来了:

protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (!IsKeyboardMode)
{
IsKeyboardMode = true;
//Debug.WriteLine("Changing to keyboard mode from PreviewKeyDown");
}
}

protected override void OnPreviewKeyUp(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (!IsKeyboardMode)
{
IsKeyboardMode = true;
//Debug.WriteLine("Changing to keyboard mode from PreviewKeyUp");
}
}

protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
if (IsKeyboardMode)
{
IsKeyboardMode = false;
//Debug.WriteLine("Changing to mouse mode");
}
}

这对键盘和鼠标的预览事件使用react,以设置适当的输入模式。仅当最后一个输入来自键盘时,焦点矩形才可见。

关于wpf - 将焦点矩形应用于子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11667136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com