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:
-
探测与 pack URI 匹配的 AssemblyAssociatedContentFileAttribute 属性的程序集元数据。
-
如果找到 AssemblyAssociatedContentFileAttribute 属性,则 pack URI 的路径引用内容文件。
-
如果未找到 AssemblyAssociatedContentFileAttribute 属性,则探测被编译到本地程序集中的资源文件集。
-
如果找到与 pack URI 的路径匹配的资源文件,则 pack URI 的路径引用资源文件。
-
如果未找到合适的资源,则内部创建的 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.