【问题标题】:How can I put a breakpoint on WPF DependencyProperty retrieval?如何在 WPF DependencyProperty 检索上设置断点?
【发布时间】:2019-08-08 17:13:25
【问题描述】:

当 WPF检索我的自定义 DependencyProperty 的值时,如何创建触发的断点?

I wrote this question poorly the first time。不幸的是,理解why my breakpoint is not hit 并不能解决我真正的问题。这是我应该问的问题。搜索高低我仍然看不到如何做到这一点。

如果 WPF 要绕过我的 getter 函数,还有其他方法吗?

出于调试目的,我需要它,以便在 WPF 检索此属性的确切时刻检查我的控件在调试器中的状态。

刷新,下面是我的自定义依赖属性

private static readonly DependencyPropertyKey ColorizerPropertyKey =
    DependencyProperty.RegisterReadOnly(
        nameof(Colorizer),
        typeof(SurfaceSeries3DColorizer),
        typeof(SurfaceDisplay),
        new FrameworkPropertyMetadata());

private static readonly DependencyProperty ColorizerProperty = 
    ColorizerPropertyKey.DependencyProperty;

public SurfaceSeries3DColorizer Colorizer
{
    get => (SurfaceSeries3DColorizer) GetValue(ColorizerProperty);
    private set => SetValue(ColorizerPropertyKey, value);
}

...这是绑定到它的 XAML

<tk:SurfaceSeries3D ItemsSource="{Binding Points}"
                    XValueBinding="X"
                    YValueBinding="Y"
                    ZValueBinding="Z"
                    Colorizer="{Binding Colorizer}"
                    />

【问题讨论】:

  • WPF 调用 GetValue。那不在您的代码中。没有办法在任何地方放置断点。
  • 我了解它的工作原理。我正在寻找解决方法。当 WPF 设置 我的值时,我已经有了一个,我可以在元数据中指定一个值更改的回调并在那里放置一个断点。我正在寻找一些等效的吸气剂或其他解决方法
  • 你也应该明白,你要求的是不可能的。
  • 好吧,我已经问过了,所以也许外面的其他人已经找到了办法,嗯?
  • 我认为唯一的选择是创建一个虚拟转换器并将其应用于绑定。通过虚拟转换器,我的意思是一个 IValueConverter,它只返回传入的任何内容。然后,当 WPF 获取 DP 的值时,它将把它传递给转换器。不完全是你所说的你想要的,但也许它会有所帮助?如果您有多个绑定,请添加一个唯一的转换器参数,以便您知道您正在处理哪一个。 Colorize="{Binding Colorizer, Converter={StaticResource DummyConverter}, ConverterParameter=Instance1}".

标签: wpf dependency-properties


【解决方案1】:

有一种方法可以做到这一点,但您必须记住,您的调试对象(您调试的应用程序)和调试器本身将变得非常无响应。

因此,如果您尝试诊断一些令人讨厌且罕见的错误,这可能会有所帮助。否则,它就毫无用处,因为您的应用程序将几乎无法使用。

转到 Visual Studio 中的 Breakpoints 窗口并选择 New --> Function Breakpoint...

输入:

System.Windows.DependencyObject.GetValue

启用条件复选框并输入您的条件:

dp == YourNamespace.YourClass.YourDependencyProperty

这里,dpGetValue 方法的参数名称(不要更改),YourNamespace.YourClass.YourDependencyProperty 是您的依赖属性 public 字段的全名(更改)。

现在,按 F5 即可享受。

在幕后,调试器将检查对System.Windows.DependencyObject.GetValue 方法的每一个调用,当提供的参数成为您的属性时,调试器将破坏您的应用程序。

请注意,WPF非常频繁地调用该方法 - 这就是您的应用和调试器将变得无响应的原因:每次调用都会检查一个条件,并且该条件需要在调试器和被调试对象之间传输数据。

【讨论】:

  • 这听起来很不错。我会试一试。让我们希望“克莱门斯”下次想告诉某人“这不可能”时记得这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2020-01-11
相关资源
最近更新 更多