我们有一个自定义 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/