首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在选项卡之间移动时阻止WPF验证错误消失?

在WPF中,当切换选项卡时,验证错误消息会自动消失。如果希望在选项卡之间移动时保留验证错误消息,可以通过以下方法实现:

  1. 在XAML中,为每个选项卡的内容区域添加一个AdornerDecorator元素。例如:
代码语言:xml
复制
<TabControl>
    <TabItem Header="Tab 1">
        <TabItem.Content>
            <AdornerDecorator>
                <!-- Tab 1 Content -->
            </AdornerDecorator>
        </TabItem.Content>
    </TabItem>
    <TabItem Header="Tab 2">
        <TabItem.Content>
            <AdornerDecorator>
                <!-- Tab 2 Content -->
            </AdornerDecorator>
        </TabItem.Content>
    </TabItem>
</TabControl>
  1. 创建一个自定义的ValidationAdornerBehavior类,继承自Behavior<AdornerDecorator>,用于在选项卡切换时管理验证错误消息的显示和隐藏。在该类中,重写OnAttached方法和OnDetaching方法,分别在附加和解除附加行为时进行相应的处理。以下是一个示例实现:
代码语言:csharp
复制
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Interactivity;

public class ValidationAdornerBehavior : Behavior<AdornerDecorator>
{
    private AdornerLayer adornerLayer;

    protected override void OnAttached()
    {
        AssociatedObject.Loaded += AssociatedObject_Loaded;
        AssociatedObject.Unloaded += AssociatedObject_Unloaded;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Loaded -= AssociatedObject_Loaded;
        AssociatedObject.Unloaded -= AssociatedObject_Unloaded;
    }

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        adornerLayer = AdornerLayer.GetAdornerLayer(AssociatedObject);
        if (adornerLayer != null)
        {
            adornerLayer.Add(new ErrorAdorner(AssociatedObject));
        }
    }

    private void AssociatedObject_Unloaded(object sender, RoutedEventArgs e)
    {
        if (adornerLayer != null)
        {
            var adorners = adornerLayer.GetAdorners(AssociatedObject);
            if (adorners != null)
            {
                foreach (var adorner in adorners)
                {
                    adornerLayer.Remove(adorner);
                }
            }
        }
    }

    private class ErrorAdorner : Adorner
    {
        public ErrorAdorner(UIElement adornedElement) : base(adornedElement)
        {
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            var adornedElement = AdornedElement as FrameworkElement;
            if (adornedElement != null)
            {
                var validationErrors = Validation.GetErrors(adornedElement);
                if (validationErrors != null && validationErrors.Count > 0)
                {
                    // 在绘制上方显示错误消息的UI
                    // 例如,可以使用TextBlock显示错误消息
                    var textBlock = new TextBlock();
                    foreach (var error in validationErrors)
                    {
                        textBlock.Text += error.ErrorContent.ToString() + "\n";
                    }
                    drawingContext.DrawText(new FormattedText(textBlock.Text, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Brushes.Red), new Point(0, -20));
                }
            }
        }
    }
}
  1. 在XAML中,将该行为附加到每个AdornerDecorator元素上。例如:
代码语言:xml
复制
<TabControl>
    <TabItem Header="Tab 1">
        <TabItem.Content>
            <AdornerDecorator>
                <i:Interaction.Behaviors>
                    <local:ValidationAdornerBehavior />
                </i:Interaction.Behaviors>
                <!-- Tab 1 Content -->
            </AdornerDecorator>
        </TabItem.Content>
    </TabItem>
    <TabItem Header="Tab 2">
        <TabItem.Content>
            <AdornerDecorator>
                <i:Interaction.Behaviors>
                    <local:ValidationAdornerBehavior />
                </i:Interaction.Behaviors>
                <!-- Tab 2 Content -->
            </AdornerDecorator>
        </TabItem.Content>
    </TabItem>
</TabControl>

这样,在切换选项卡时,验证错误消息将保留在界面上,直到错误被修复或切换到其他选项卡。请注意,上述示例中使用了System.Windows.Interactivity命名空间,需要在XAML文件中添加对System.Windows.Interactivity程序集的引用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

实时可视化树中的Just My XAML 可移动的应用内工具栏(v16.3): 应用程序内工具栏已得到增强,可在正在运行的 WPF / UWP 应用程序中移动,从而使开发人员能够在应用程序中向左或向右拖动它以解除阻止应用程序...请注意,工具栏移动到的位置不会在会话之间存储,并且在您的应用重新启动时会返回到默认位置。 ?...可移动的应用内工具栏(v16.3) XAML绑定失败面板(独立的 VSIX 早期 alpha 预览): 为了在开发人员的应用程序中发生数据绑定失败时为开发人员提供帮助,我们在开发中提供了一项新功能,该功能为...在此版本中,我们已修复了 IntelliSense 错误,此修复程序中 #regions 现在将在您开始输入时正确显示。...单击后,XAML 设计器将最小化其附加的 XAML 选项卡,并仅针对 XAML 编辑器视图弹出一个新窗口。您可以将此新窗口移动到 Visual Studio 中的任何显示或选项卡组。

7.4K30

Sketch 91中文版「矢量图UI设计工具」

工作区窗口现在支持同时选择多个文档,让您更轻松地批量打开、移动和删除它们。...您现在可以分别使用键盘快捷键Shift-Command-1和Shift-Command-2在 Inspector 中的 Design 和 Prototype 选项卡之间切换。...我们使移动有边框但没有填充的形状变得更加容易。您现在可以拖动该形状上的任何位置(包括未填充区域)来移动它,而不仅仅是在边框本身上。我们提高了边界更宽的路径的阴影的准确性。...什么是固定的修复了在原型播放器中显示叠加层后面的背景模糊饱和度停止的错误。修复了阻止色调应用到应用了色调的组中的图层阴影的错误。修复了导致您设置为“无”的交互完全消失的错误。现在他们会留下来。...修复了将边框添加到使用下划线或删除线装饰的文本时停止出现的问题。修复了导致图层和页面列表在垂直滚动时意外水平滚动的错误。修复了导致交互在原型播放器中显示为活动的错误,即使它们各自的层被隐藏了。

99920
  • 【愚公系列】2023年10月 WPF控件专题 ToolBar控件详解

    WPF控件可以分为两类:原生控件和自定义控件。 原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。...ToolBar控件通常用来放置一系列可以执行命令的按钮或其他控件,常见的应用场景是如Microsoft Office等办公软件中的工具栏。...OverflowMode:用于设置ToolBar溢出时的展现方式,可选值为AsNeeded(按需展现)和Always(总是展现)。 ButtonStyle:用于设置ToolBar中的按钮的样式。...ToolBarTray.IsLocked:用于控制ToolBar是否可以移动。...导航工具条:在复杂的应用程序中使用工具条帮助用户浏览不同的页面和区域,例如一个具有多个选项卡的应用程序,每个选项卡对应一个不同的页面。

    49531

    .NET周刊【2月第1期 2024-02-04】

    广泛应用于物联网设备之间的通信,如卫星通信传感器、医疗设备和家居自动化。...通过实现IAbpClaimsPrincipalContributor接口,可以将自定义声明添加到身份验证票据中,以便在用户请求时使用。...实验包括多个功能,如区分Visual Studio实例、为括号对添加颜色、文件比较、带适当缩进的复制、获取开发者新闻、环绕选择、滚动文档选项卡和图像悬停预览。...部分功能已集成到Visual Studio 2022中,如为括号对添加颜色、文件比较、带适当缩进的复制、环绕选择和滚动文档选项卡。...- Qiita https://qiita.com/sator_imaging/items/49585b191af978b00ad2 如果您编写的代码在不移动跨度时导致重叠,会发生什么情况,以及 Unity

    20610

    WPF面试题-来自ChatGPT的解答

    View和ViewModel之间的分离也使得团队合作更加高效,开发人员可以独立地进行界面和业务逻辑的开发和测试。 20. 如何在WPF应用程序中全局捕获异常?...当我们在XAML中定义UI界面时,实际上是在创建可视化树。WPF框架会根据可视化树来确定UI元素的位置和大小,并将它们渲染到屏幕上。 逻辑树是另一个层次结构,它描述了UI元素之间的逻辑关系。...性能:ObservableCollection在添加、删除和移动元素时的性能较好,但在大量元素的排序和搜索操作上性能较差。...BindingList在排序和搜索操作上性能较好,但在添加、删除和移动元素时的性能较差。...数据验证:依赖属性可以与数据验证机制一起使用,实现对属性值的验证和错误提示。通过依赖属性,可以定义属性值的验证规则和错误处理逻辑,从而确保属性值的有效性和一致性。

    44730

    答案:Excel VBA编程问答33题,继续……

    10.当用户在任何工作表中进行修改操作时,将触发哪个事件? Workbook.SheetChange事件。 11.用户如何阻止打开工作簿时触发Open事件? 按住Shift键。...12.什么是数据验证? 数据验证是确保用户不会输入无效数据的过程,例如在输入数字时应输入文本。 13.你应该在何处放置工作簿级别事件的事件过程? 在ThisWorkbook模块中。...错误。必须使用“项目工程属性”对话框中的“保护”选项卡,将VBA工程与设置给工作簿的任何密码分开锁定。 17.是非题:一个bug阻止程序运行。 错误。bug会阻止程序正常运行,但不会阻止程序运行。...Option Explicit是避免bug和错误的重要方法。 19.什么是断点? 断点导致程序执行在指定的代码行上暂停。 20.调试命令“逐过程”和“逐语句”之间有什么区别?...29.如何验证仅接受包含某些值的属性的数据? 通过在Property Let过程中放置代码来检查新的属性值,并仅在正确的情况下接受它。 30.如何在代码中引用对象属性?

    4.2K20

    .NET周刊【6月第5期 2024-06-30】

    特别强调了WPF中WriteableBitmap使用的两个缓冲区的操作方式,以及不同像素格式之间的转换问题。...WPF/C#:如何实现拖拉元素 https://www.cnblogs.com/mingupupu/p/18270547 这篇文章介绍了如何在WPF Canvas中实现拖放功能。...在WPF中实现业务层验证可使用IDataErrorInfo接口,提供自定义错误信息。通过在类中实现此接口,可在用户界面显示详细错误信息,帮助用户纠正输入错误。...此外,WPF触发器用于在特定条件满足时改变控件外观或行为,包括属性触发器、数据触发器和事件触发器等。...Fake权限验证小例子 https://www.cnblogs.com/aoximin/p/18258862 本地测试时,使用swagger调试时填写token不便,可通过伪造权限验证来解决。

    16810

    本地化入门

    2.3 设计时支持 VisualStudio的XAML设计时支持对开发WPF程序至关重要,对本地化来说,设计时支持主要包含3部分: 在编写XAML时可以得到资源的智能感知 有完整的设计视图 在不同语言之间切换...麻烦的是,WPF似乎不是很喜欢这种方式,VisualStudio会提示这种错误,毕竟资源文件中的属性都是static属性,不是实例成员。幸运的是编译一次这种错误提示就会消失。 ?...容易在程序集之间共享。 支持TypeConverter,这样就可以使用除String以外的其它类型。 支持Binding的其它功能,如IValueConverter。...结语 这篇文章只介绍了本地化的入门知识,其它还有很多本地化的要点,如验证信息中的本地化没有涉及。...WPF 全球化和本地化概述里有介绍一些本地化的最佳做法,如UI上应该使用相对布局而非绝对布局、字体选择等,这里不再累赘。

    2.5K20

    Chrome 121 发布,新特性一览!

    同样,出现、消失或移动的遮盖内容也无需特殊处理。 我们来看看代码怎么写,首先,允许用户捕获当前标签页。 // 请求用户授权,开始捕获当前的标签页。...它可以声明查询参数键的顺序不应阻止匹配,特定的查询参数不应阻止匹配,或者只有某些已知的查询参数应该引起不匹配。...这个属性现在支持动画,因此在调色板之间切换变成了两个选定的调色板之间的平滑过渡。...伪元素 ::spelling-error 和 ::grammar-error 允许你自定义拼写和语法错误的颜色,使用背景颜色或其他装饰来突出显示拼写错误的单词,并实现自定义的拼写检查。...Devtools 更新 Devtools Application 选项卡现在可以更友好的展示 COXP、CSP 等安全 Header: 然后在 Issues 选项卡可以更友好的展示 CSP 违规示例:

    44310

    Akismet插件教程WordPress阻止过滤垃圾邮件插件

    该算法从其错误和其他网站采取的行动中学习。当多个网站开始将外观相似的内容报告为垃圾邮件时,Akismet 将学会在未来将此类内容识别为垃圾邮件。   ...当一条评论被Akismet标记为垃圾邮件时,它不会像其他评论那样显示等待审核通知,相反,会自动将它们移动到垃圾邮件文件夹。   ...推荐:如何设置/禁用WordPress网站的评论功能 如何设置Akismet反垃圾邮件插件   现在,让我们看看如何在您的网站上配置Akismet。...推荐:如何阻止WordPress垃圾评论 4、获取Akismet API Key   在上一步骤完成后,Akismet将向您注册的电子邮件地址发送验证码。检查您的电子邮件并返回您的帐户页面。...接下来,可以通过WordPress仪表板导航到“ 评论 ”,然后选择“ 垃圾邮件 ”选项卡来查看垃圾邮件评论。

    1.7K20

    dotnet 从入门到放弃的 500 篇文章合集

    wpf 如何使用 Magick.NET 播放 gif 图片 WPF 如何在 WriteableBitmap 写文字 WPF 如何在应用程序调试启动 WPF 如何在绑定失败异常 WPF 如何画出1像素的线...WPF 弹出 popup 里面的 TextBox 无法输入汉字 WPF 拖动时出现 Invalid FORMATETC structure WPF 拖动滚动 wpf 拦截异常 让多线程异常不会让程序闪退...WPF 拼音输入法 WPF 控件继承树 WPF 提高性能 WPF 播放 gif WPF 渲染级别 WPF 省市县3级联动 WPF 禁用实时触摸 WPF 程序生成类库错误 WPF 等距布局 wpf 绑定...资源冻结 WPF 高性能笔 WPF 鼠标移动到列表上 显示列表图标 wpf-DoEvents WPF绑定密码 xamarin_forms_jin_du_tiao_kong_jian xaml 添加 region...git 大文件 如何在 UWP 使用 wpf 的 Trigger 如何安装 btsync 如何移动 nuget 缓存文件夹 安装 aria2 安装 pip 安装 wordpress 安装visualStudio

    10.5K20

    【网页】HTTP错误汇总(404、302、200……)

    信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。...• 302 - 对象已移动。 • 304 - 未修改。 • 307 - 临时重定向。 4xx - 客户端错误 发生错误,客户端似乎有问题。...• 404.2 - Web 服务扩展锁定策略阻止本请求。 • 404.3 - MIME 映射策略阻止本请求。...若要验证这一点,请在 MMC 中右击目录,依次单击属性、目录选项卡和配置,然后验证相应文件类型的脚本映射是否设置为允许所使用的谓词。 • 403.2 - 读访问被禁止。...刷新页面后,此信息即会消失。如果刷新页面后,此信息再次出现,可能是防病毒软件正在扫描 Global.asa 文件。

    12.1K20

    【编辑】解决 Wpf TabControl 在所有选项卡上仅创建一个视图 的问题

    【编辑】解决 Wpf TabControl 在所有选项卡上仅创建一个视图 的问题 原标题:Wpf TabControl create only one view at all tabs(https://...问题是你有一个 WPF 模板,无论你在它后面放什么数据,它都应该是相同的。因此,将创建模板的一个副本,每当 WPF 在 UI 树中遇到 ListViewModel 时,它都会使用该模板绘制它。...未绑定到 DataContext 的该控件的属性将在更改 DataSources 之间保持其状态。...您可以使用 x:Shared="False"(此处为示例),但是,这会在 WPF 请求模板时创建模板的新副本,包括切换选项卡时。...我还更正了移除 collectionChanged 处理方法时的一个错误。

    7010

    .NET周刊【9月第2期 2024-09-08】

    国内文章 WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹 https://www.cnblogs.com/lindexi/p/18390983 本文将告诉大家如何在 WPF...结构型模式关注类或对象的组合,如适配器、装饰器等。行为型模式着重对象间通信,如策略模式、观察者模式等。具体实现和示例代码参见C#版本设计模式,推荐阅读《设计模式之禅》。....NET验证框架,支持链式操作和多平台。...此版本包括对本机 AOT 的支持、将 WebView2 版本迁移到 NuGet 引用、新的包部署 API、对 TabView 选项卡分离的改进以及其他一些控件改进和 API 添加。...此版本添加了对哈希字段过期命令的支持,添加了对“HSCAN NOVALUES”的支持,并修复了多个错误。

    8310

    WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

    方案 WindowChrome AllowsTransparency 拖拽标题栏移动窗口 保留 自行实现 最小化最大化关闭按钮 丢失 丢失 拖拽边缘调整窗口大小 丢失 丢失 移动窗口到顶部可最大化 丢失...表格中: 保留 表示此功能无需任何处理即可继续支持 自行实现 表示此功能已消失,但仅需要一两行代码即可补回功能 丢失 表示此功能已消失,如需实现需要编写大量代码 另外,以上表格仅针对鼠标操作窗口。...这两种实现的窗口之间还有一些功能上的区别: 方案 WindowChrome AllowsTransparency 点击穿透 在完全透明的部分点击依然点在自己的窗口上 在完全透明的部分点击会穿透到下面的其他窗口...然而,如果你希望在使用高性能的 WindowChrome 时也依然能点击穿透,那么你需要使用到一点点的小技巧来绕过 WPF 对 WS_EX_LAYERED 窗口样式的锁定。...,以避免陈旧错误知识的误导,同时有更好的阅读体验。

    1.7K20

    如何让 WPF 程序更好地适配 UI 自动化

    WPF 自带的 UI 自动化 为了方便演示,我使用 Visual Studio 自带的模板创建一个默认的 WPF 应用程序,我会不断修改这个程序,然后用我自己写的 UI 自动化测试软件来验证它的自动化适配效果...如果你设置了控件的内容(例如按钮/复选框/单选框/列表项的 Content,例如菜单项/选项卡的 Header),那么 UI 自动化在捕获到此控件后,其自动化 Name 就是对应指定的这些属性。...然而,实际情况却并不是这样…… 哪些情况会破坏 WPF 的 UI 自动化 很多时候,我们在写代码时,可能太过于关注最终做成了什么样子,而忽略了控件原本的层次结构和属性含义,这就可能导致我们的程序暴露给...毕竟 WPF 默认也不太好将全部控件暴露给 UI 自动化,否则对 UI 自动化测试软件或读屏软件来说,将面临着如 WPF 可视化树般复杂和庞大的 UI 自动化树。...,以避免陈旧错误知识的误导,同时有更好的阅读体验。

    50320
    领券