Wpf 这个触发器为什么起作用?

Wpf 这个触发器为什么起作用?,wpf,attached-properties,Wpf,Attached Properties,底部的代码使DockPanel Visibility=在TextBlock有空字符串值时崩溃,这正是我想要的。然而,我偶然发现了这个问题,我想知道为什么在TextBlock中设置DockPanel.Visibility附加属性会影响DockPanel 我知道DockPanel.Dock是一个附加属性,您可以直接在元素中设置,例如 <TextBlock DockPanel.Dock="Top"/> …但你不能设置 <TextBlock DockPanel.Vis

底部的代码使DockPanel Visibility=在TextBlock有空字符串值时崩溃,这正是我想要的。然而,我偶然发现了这个问题,我想知道为什么在TextBlock中设置DockPanel.Visibility附加属性会影响DockPanel

我知道DockPanel.Dock是一个附加属性,您可以直接在元素中设置,例如

    <TextBlock DockPanel.Dock="Top"/>
…但你不能设置

    <TextBlock DockPanel.Visibility="Collapsed"/>
…以同样的方式

那么DockPanel如何知道为DockPanel.Visibility查询子元素,或者父元素是否总是查询所有附加属性的子元素,并在未在本地设置值时使用这些属性呢?我的印象是,只有某些附加属性以这种方式使用,例如DockPanel.Dock

此外,还有哪些其他方法可以实现相同的结果,例如使用DockPanel样式中设置的触发器-问题似乎是errorTextBlock name不在范围内

    <DockPanel x:Key="errorDisplay" LastChildFill="False">
            <Border Background="Red" DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="1">
                <TextBlock Padding="4" x:Name="errorTextBlock">
                        <TextBlock.Style>
                            <Style>
                                <Style.Triggers>
                                    <Trigger Property="TextBlock.Text" Value="">
                                    <Setter Property="DockPanel.Visibility" Value="Collapsed"/>
                                    </Trigger>
                                </Style.Triggers>
                             </Style>
                        </TextBlock.Style>
                </TextBlock>
            </Border>            
    </DockPanel>

如果您将发布的代码声明为非资源,而只是将其放在窗口/控件可视化树中,那么它应该可以正常工作,并允许您在代码隐藏中引用errorTextBlock。要回答您有关附加属性的问题,请看这里:和这里:。@Lucas,谢谢,这些链接确实在某种程度上澄清了我的问题-我仍然不确定所有库(即定义附加属性的非用户定义类)是否总是检查子元素的值集。关于直接在包含元素中插入代码,不幸的是,许多地方都需要这个Dockpanel,因此将其定义为资源。也许有人可以解释如何引用errorTextBlock,因为这里不允许这样做,而允许直接放置它似乎是不明智的