【发布时间】:2009-09-02 19:26:41
【问题描述】:
我有一个数据对象用于包含支持INotifyPropertyChanged 和IDataErrorInfo 的UI 数据。最初,我将所有 UI 控件显示在一个大型 WPF 应用程序中,并且很高兴看到通过这种自定义样式标记的错误:
<!-- Set error style for textboxes -->
<Style x:Key="txtBoxErrStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel DockPanel.Dock="Right">
<AdornedElementPlaceholder />
<Image Source="Error.png"
Height="16"
Width="16"
ToolTip="{Binding Path=AdornedElement.ToolTip, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我今天正在重新组织程序,并决定将各种 UI 控件分布在 TabControl 的几页上。我为此使用的结构布局是:
<tabcontrol>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, Groups and UI controls moved from original layout ..]
</AdornerDecorator>
</tabItem>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, Groups and UI controls moved from original layout ..]
</AdornerDecorator>
</tabItem>
...
</tabcontrol>
(我正在使用AdornerDecorator,正如我在之前的程序中所经历的那样,交换标签页时错误样式没有被重新呈现。我不记得我在哪里看到的,但它确实帮助了我。)
现在,当我启动我的程序时,错误样式在程序启动时打开的TabItem 上正确呈现,但在另一个(隐藏)TabItems 上没有正确呈现。当我选择(并显示)其中一个 TabItems 时,设置了错误样式的工具提示,但不显示错误图标图像。
我还测试了删除自定义样式并恢复为文本框的默认 WPF 错误样式,我仍然得到类似的行为,即在程序打开时隐藏的 TabItems 上的控件周围没有红色框。
所以我似乎完全错过了阻止错误样式正确呈现的东西,而不是打开的选项卡项。有什么想法吗?
编辑 9 月 3 日 更改了描述以支持更好地理解我所看到的内容
谈 2014 年的似曾相识
现在是 2014 年 11 月,今天我遇到了这个愚蠢的 WPF 问题,错误模板未显示在选项卡控制器中显示的项目上。我脑海中的某件事表明我以前见过这个问题。于是我用谷歌搜索,首先弹出的是我自己 2009 年的问题!
这次我看到了我上次解决问题后添加的来自 dkl 的评论。所以我尝试了他的方式并使用了这个解决方案(效果很好,我不需要在我的选项卡控件上撒上 Adorner 控件):
<Style x:Key="TextBoxErrorStyle" TargetType="TextBox">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError" Value="True" />
<Condition Property="IsVisible" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Red"
FontSize="14pt"
Margin="-15,0,0,0" FontWeight="Bold">*
</TextBlock>
<Border BorderBrush="Red" BorderThickness="2">
<AdornedElementPlaceholder Name="controlWithError"/>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</MultiTrigger>
</Style.Triggers>
</Style>
【问题讨论】:
标签: c# wpf tabs tabcontrol styles