10

我们有一个自定义画布,它有专门的节点,其行为很像标准 MDI 应用程序的窗口。期望的行为是,如果“窗口”的任何子控件具有焦点,则该“窗口”被认为是活动的。

现在 IsFocused 属性似乎没有级联,这意味着如果子控件具有焦点,它的容器也没有设置为“focused”,所以我们不能使用它。出于同样的原因,我们不能在容器上设置 IsFocused 属性,因为我相信这会从孩子那里偷走它。

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

但是当然,如​​果我们可以简单地问一个控件“嘿......你或你的任何孩子有焦点吗?”会好得多。

那你可以吗?

4

1 回答 1

13

您可以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>

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

于 2011-02-10T06:27:21.367 回答