wpf - 如何根据自定义控件的子元素是否具有焦点来设置样式?

标签 wpf focus containers mdichild focusmanager

我们有一个自定义 Canvas ,其中包含专门的节点,这些节点的行为非常类似于标准MDI应用程序的窗口。期望的行为是,如果“窗口”的任何子控件都具有焦点,则称该“窗口”处于事件状态。

现在,IsFocused属性似乎没有级联,这意味着如果子控件具有焦点,则它的容器也不会设置为“focused”,因此我们不能使用它。出于同样的原因,我们无法在容器上设置IsFocused属性,因为我认为这会从 child 那里窃取它。

我唯一的想法是创建一个名为HasChildWithFocus或类似名称的新DP,然后在代码背后,监听冒泡事件并设置该标志。不确定这是最好的方法。 (我们可以将其作为附加属性/附加行为的组合来实现。)

但是,当然,如果我们简单地要求一个控件“嘿……您或您的任何一个 child 都有焦点吗?”会更好。

这样可以吗

最佳答案

您可以像这样直接使用UIElement.IsKeyboardFocusWithin:

<Grid>
    <Grid.Resources>
        <Style x:Key="panelStyle" TargetType="Border">
            <Setter Property="BorderBrush" Value="PaleGoldenrod"/>
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="BorderBrush" Value="PaleGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>
    <UniformGrid Columns="2">
        <Border BorderThickness="10" Style="{StaticResource panelStyle}">
            <StackPanel>
                <TextBox Text="TextBox1"/>
                <TextBox Text="TextBox2"/>
            </StackPanel>
        </Border>
        <Border BorderThickness="10" Style="{StaticResource panelStyle}">
            <StackPanel>
                <TextBox Text="TextBox3"/>
                <TextBox Text="TextBox4"/>
            </StackPanel>
        </Border>
    </UniformGrid>
</Grid>

在此示例中,包含具有键盘焦点的元素的边框使用不同的边框笔刷设置样式。

关于wpf - 如何根据自定义控件的子元素是否具有焦点来设置样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953719/

相关文章:

angular - Docker 容器不会重新加载 Angular 应用程序

docker - Docker:为什么我的Rest API和Web APP无法通信?

docker - 如何使用环境文件将环境变量传递到独立的vscode远程容器中?

wpf - 应使用哪个事件从 WPF 中的 TextBox(LostFocus、LostKeyboardFocus 等)更新模型?如何在WPF中设置事件的优先级?

wpf - 如何获得 WPF 验证错误

qt - QML TextField 设置焦点突出显示颜色

android - 禁用焦点上的橙色轮廓突出显示

c# - 使用 WPF C# 同时对两个 UIElement 进行动画处理

wpf - Entity Framework 4 - 关联通知

qt - 如何获取点击 QGraphicsItem 的事件,并收到 focusOut 通知