记录一些WPF

本文介绍了WPF中DispatcherUnhandledException事件的处理方法,探讨了如何通过Invoke与BeginInvoke进行同步与异步操作,解析了PackURI的工作原理,并讨论了WPF应用中其他关键事件的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

DispatcherUnhandledException 事件处理程序接受一个传递给它的 DispatcherUnhandledExceptionEventArgs 参数,该参数包含关于未处理异常的上下文信息,其中包括异常本身 (DispatcherUnhandledExceptionEventArgs..::.Exception)。使用该信息可以确定如何处理异常。

在处理 DispatcherUnhandledException 时,应当将 DispatcherUnhandledExceptionEventArgs..::.Handled 属性设置为 true;否则,WPF 仍会将异常视为未处理的异常,并恢复前面描述的默认行为。如果引发未处理的异常,并且或者 DispatcherUnhandledException 事件未被处理,或者该事件被处理但 Handled 被设置为 false,则应用程序会立即关闭。而且,不会再引发其他 Application 事件。因此,如果应用程序具有必须在应用程序关闭之前运行的代码,则需要处理 DispatcherUnhandledException

 

2.

对于在主 UI 线程上运行的代码未处理的每个异常,Application 都将引发一个 DispatcherUnhandledException

 

3.

Invoke 是同步操作,而 BeginInvoke 是异步操作

 

4.

Pack URI 方案使用“pack”作为它的方案,并且包含两个组件:授权和路径。以下是 pack URI 的格式。

pack://授权/路径

授权 指定包含部件的程序包的类型,而路径 则指定部件在程序包中的位置

 

5.

为了确定 pack URI 引用的文件的类型,WPF 使用下面的试探法来解析本地程序集中的资源文件以及内容文件的 URI:

  1. 探测与 pack URI 匹配的 AssemblyAssociatedContentFileAttribute 属性的程序集元数据。

  2. 如果找到 AssemblyAssociatedContentFileAttribute 属性,则 pack URI 的路径引用内容文件。

  3. 如果未找到 AssemblyAssociatedContentFileAttribute 属性,则探测被编译到本地程序集中的资源文件集。

  4. 如果找到与 pack URI 的路径匹配的资源文件,则 pack URI 的路径引用资源文件。

  5. 如果未找到合适的资源,则内部创建的 Uri 无效。

6.

如果未处理 Closing,或者处理但未取消,则窗口将关闭。在窗口真正关闭之前,会引发 Closed。这时无法阻止窗口关闭。只有在Closing事件里才能阻止窗口关闭

 

7.

应将按 Esc 键配置为与按“取消”按钮等效的键盘快捷键。可以通过将“取消”按钮的 IsCancel 属性设置为 true 来实现此目的。

应将按 Enter(或 Return)键配置为与按“确定”按钮等效的键盘快捷键。可以通过将“确定”按钮的 IsDefault 属性设置为 true 来实现此目的。

 

8.

递归检查一个控件及其子控件内,是否有Validation是failed的

// Validate all dependency objects in a window
        bool IsValid(DependencyObject node)
        {
            // Check if dependency object was passed
            if (node != null)
            {
                // Check if dependency object is valid.
                // NOTE: Validation.GetHasError works for controls that have validation rules attached
                bool isValid = !Validation.GetHasError(node);
                if (!isValid)
                {
                    // If the dependency object is invalid, and it can receive the focus,
                    // set the focus
                    if (node is IInputElement) Keyboard.Focus((IInputElement)node);
                    return false;
                }
            }

            // If this dependency object is valid, check all child dependency objects
            foreach (object subnode in LogicalTreeHelper.GetChildren(node))
            {
                if (subnode is DependencyObject)
                {  
                    // If a child dependency object is invalid, return false immediately,
                    // otherwise keep checking
                    if (IsValid((DependencyObject)subnode) == false) return false;
                }
            }

            // All dependency objects are valid
            return true;
        }

 

9.

Remember, the property wrappers shouldn’t contain any logic, because properties
may be set and retrieved directly using the SetValue() and GetValue() methods of the base
DependencyObject class.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值