我们有一个自定义画布,它有专门的节点,其行为很像标准的MDI应用程序的窗口。期望的行为是,如果“窗口”的任何子控件具有焦点,则该“窗口”被认为是活动的。
现在,IsFocused属性似乎没有级联,这意味着如果子控件具有焦点,它的容器也不会设置为“聚焦”,因此我们无法使用它。出于同样的原因,我们不能在容器上设置IsFocused属性,因为我认为它会从孩子身上偷走它。
我唯一的想法是创建一个名为HasChildWithFocus的新DP或类似的东西,然后在代码隐藏中,监听冒泡事件并设置该标志。不确定这是最好的方式。 (我们可以将它作为附加属性/附加行为的组合来实现。)
但当然,如果我们可以简单地询问一个控件'嘿......你或你的任何一个孩子有焦点吗?'
你也可以吗?
答案 0 :(得分:10)
您可以直接使用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>
在此示例中,包含具有键盘焦点的元素的边框使用不同的边框画笔进行样式设置。