11

我想将 DataBinding 错误记录到文件中。我使用了这个接受的答案中提出的解决方案:

如何将绑定错误转换为运行时异常?

我也试过这个:http: //msdn.microsoft.com/en-us/library/system.diagnostics.presentationtracesources.aspx

问题是它仅在 VS IDE 中运行时才有效。当我发布应用程序时,没有发现错误。

有谁知道如何在运行时通过已发布的应用程序以编程方式获取 WPF Bindind 错误并保存到文件中?

4

2 回答 2

8

I used a technique similar to the one described in the first link you provided. It can be resumed by the following steps:

  1. Derive a TraceListener that throws instead of logging
  2. Add your listener to PresentationTraceSources.DataBindingSource

I tested with .NET Framework 4.0, 4.5 and 4.5.1; it works on both Debug and Release configurations.

Please check the complete solution I pushed on GitHub, it includes a demo application and a unit test project.

Exception in Visual Studio

于 2013-10-26T18:33:48.617 回答
1

我参加聚会有点晚了,但我最近遇到了同样的问题,并深入研究了 .NET 源代码。

所以问题是只有在满足以下条件之一时才启用跟踪

AvTrace.cs:

private static bool ShouldCreateTraceSources()
{
    return AvTrace.IsWpfTracingEnabledInRegistry() || AvTrace.IsDebuggerAttached() || AvTrace._hasBeenRefreshed;
}

因此,只有在以下情况下才会报告绑定错误:

  • 在注册表中启用了 WPF 跟踪 ( HKCU\Software\Microsoft\Tracing\WPF\ManagedTracing)

  • 附加了调试器(无论应用程序是在调试模式还是发布模式下编译)

  • 追踪来源已刷新

最后一个很棘手 - 当您手动更新跟踪源时会刷新跟踪源:

PresentationTraceSources.DataBindingSource

这就是它在 Benoit Blanchon 提供的解决方案中起作用的原因

但是当您直接在 app.config 文件中定义跟踪源时,它将不起作用。如果要创建追踪源,需要手动调用:

PresentationTraceSources.Refresh();

这将重新读取 app.config,但也会调用 internalAvTrace.OnRefresh()来更改_hasBeenRefreshed标志并启用跟踪。

于 2019-04-11T22:09:06.473 回答