在我的WPF应用程序中,我们使用装饰器来显示验证消息,在特定情况下,存在具有多个控件的单行网格,其中一些控件具有验证.我遇到的问题是我想强制错误消息控件的宽度与网格相同,但似乎无法找到从adorner模板引用该网格的方法.以下是我尝试过的示例:
<ControlTemplate x:Key="Local_TopAdornedTemplateWide">
<StackPanel>
<AdornedElementPlaceholder x:Name="adornedElement"/>
<TextBlock MaxWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid}, ElementName=adornedElement}"
TextWrapping="Wrap"
Text="{Binding Converter={StaticResource Local_ValidationErrorMessageConverter}}"
Style="{DynamicResource Error_Text}"
Padding="2 1 0 0"
Visibility="{Binding ElementName=adornedElement, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
/>
</StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
这会导致应用程序因XamlParseException而崩溃.
理想情况下,解决方案不会特定于网格,因此它将获得任何容器类型的宽度,但是现在网格是唯一的用例.
编辑: 这是我们在应用程序中使用的另一个模板的示例; 此模板不适用于我的情况,因为它会将错误限制为上述网格的单个列的宽度:
<ControlTemplate x:Key="Local_TopAdornedErrorTemplate">
<StackPanel>
<AdornedElementPlaceholder x:Name="adornedElement"/>
<TextBlock MaxWidth="{Binding ElementName=adornedElement, Path=ActualWidth}"
TextWrapping="Wrap"
Text="{Binding Converter={StaticResource Local_ValidationErrorMessageConverter}}"
Style="{DynamicResource Error_Text}"
Padding="2 1 0 0"
Visibility="{Binding ElementName=adornedElement, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
/>
</StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
使用snoop我捕获了以下两个截图(我无法使用其中一个完整的堆栈来防止发布任何专有的)
此镜头显示了我之前提到的网格,其中是正在装饰的FinancialTextBox项目
此镜头显示两件事,以蓝色选择的项目是上一镜头中网格的最高祖先,黄色高亮显示是内容模板中的文本框
有了这两个,似乎很明显(基于来自Contango答案的信息)这两个项目并不在同一个视觉树中,这会让我相信我的问题是不可能的.然而,我添加的第二个模板(确实有效)表明来自装饰元素的至少一些视觉信息存在于占位符中.
所以现在我的问题归结为a)这些信息是否包括装饰元素的父级和b)如何通过对不同元素的绑定来访问它?
小智 4
这最终比我试图走的路简单得多。
我正在阅读 AdornedElementPlaceholder 类,并在 MSDN 上看到此条目,并注意到该类实际上有一个名为parent的属性,我尝试了以下绑定,它运行得很好:
MaxWidth="{Binding ElementName=adornedElement,
Mode=OneWay,
Path=AdornedElement.Parent.ActualWidth}"
Run Code Online (Sandbox Code Playgroud)