gpt4 book ai didi

c# - WPF 错误样式仅在选项卡控件的可见选项卡上正确呈现

转载 作者:可可西里 更新时间:2023-11-01 03:07:24 28 4
gpt4 key购买 nike

我有一个数据对象用于包含支持 INotifyPropertyChangedIDataErrorInfo 的 UI 数据。最初,我在一个大型 WPF 应用程序中显示了所有 UI 控件,并且很高兴看到通过这种自定义样式标记的错误:

    <!-- 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 上正确呈现,但不会在另一个(隐藏的)TabItem 上正确呈现>s。当我选择(并显示)其中一个 TabItem 时,会设置错误样式的工具提示,但不会显示错误图标图像。

我还测试了删除自定义样式并恢复为文本框的默认 WPF 错误样式,我仍然得到类似的行为,即隐藏的 TabItem 控件周围没有红色框当程序打开时。

因此,我似乎完全遗漏了一些阻止错误样式在打开的选项卡项目之外正确呈现的东西。有什么想法吗?

9 月 3 日编辑 更改了描述以支持更好地理解我所看到的内容

说说2014年的似曾相识

现在是 2014 年 11 月,今天我遇到了这个愚蠢的 WPF 问题,错误模板没有显示在选项卡 Controller 中显示的项目上。我脑海中的某些东西表明我以前见过这个问题。所以我用谷歌搜索,第一个弹出的是我自己在 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>

最佳答案

(I am using the AdornerDecorator as I had experienced in a previous program the error style not being re-rendered when swapping tab pages. I can't remember where I saw this but it did help me out)

据推测,这个确实重要的提示来自 Karl Shifflets blog ,至少他在谈论同一个话题:WPF Validation Errors Disappear Inside TabControl When Switching TabItems .

鉴于此,您的问题可能只是相关的,即上面的提示/代码确保有一个专用的 AdornerLayer现在对于每个选项卡项,因为当您切换选项卡时,父元素的装饰层将被丢弃。这个专用装饰层似乎仍然需要一些特殊处理,例如问题 WPF ErrorTemplate visible when not focused?这基本上是在颠倒地处理你的问题。因此,我建议您将针对后者的概述解决方案与您的风格相结合并进行扩展,然后尝试以下操作(虽然目前尚未测试代码):

<Style x:Key="ErrorTemplate" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">...</Trigger>
<Trigger Property="IsVisible" Value="false">
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
</Trigger>
<Trigger Property="IsVisible" Value="true">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>...</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>

请参阅我对您更新 Radio Button Error Style 的评论也试图类似地解决您可能相关的问题;你真的在那里尝试过我的建议吗?

参见 Adorners Overview有关装饰器架构的更多详细信息。

关于c# - WPF 错误样式仅在选项卡控件的可见选项卡上正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369643/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com