【问题标题】:How can I style a custom control based on if any of its children have focus?如何根据任何子控件是否有焦点来设置自定义控件的样式?
【发布时间】:2011-02-10 05:31:16
【问题描述】:

我们有一个自定义的画布,它具有与标准 MDI 应用程序窗口非常相似的专用节点。期望的行为是,如果“窗口”的任何子控件具有焦点,则称该“窗口”处于活动状态。

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

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

当然,如果我们可以简单地问一个控件“嘿……你或你的孩子有焦点吗?”当然会更好。

你也可以吗?

【问题讨论】:

  • +1 对您对侦听冒泡事件并设置附加属性的附加行为的想法。这是我会做的方式,我想不出任何其他好主意!
  • 那么 +1 我的问题!来吧......在这里帮助一个怪胎! [傻笑](感谢您的反馈。是的……这是我能想到的唯一方法。)

标签: wpf focus containers mdichild focusmanager


【解决方案1】:

你可以像这样直接使用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>

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

【讨论】:

  • 完美!正是我想要的。 (不知道那个属性。)完美的时机,因为我刚刚开始写附加的东西,所以现在我不必了! :)
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 2012-03-02
  • 2018-01-11
  • 2020-02-24
  • 2015-12-26
  • 2013-12-20
  • 2019-05-19
  • 2012-10-22
相关资源
最近更新 更多