如何在“依赖属性已更改”上设置断点?

时间:2011-09-16 16:57:03

标签: silverlight debugging dependency-properties breakpoints

我们的Silverlight应用程序包含第三方控件,其中包含一些ScrollBars(以及其他内容)。为了解决问题,我希望能够在第三方控件修改任何滚动条的最小或最大属性时停止在调试器中。然后,我将能够查看堆栈跟踪并了解有关正在发生的事情的更多信息。

如果我对ScrollBars的Value属性感兴趣,那一切都很简单--ScrollBar有一个ValueChanged事件,所以我可以添加一些抛弃该事件在ScrollBar上的一次性代码,在我的事件处理程序中设置一个断点,并调试。但是对于MinimumChanged或MaximumChanged没有相应的CLR事件,所以它不会那么简单。

我浏览了一篇关于using DependencyPropertyDescriptor to get dependency property change events的博文,但不幸的是,Silverlight中不存在DependencyPropertyDescriptor

我怎样才能设置一个断点,只要ScrollBar的最小和最大属性发生变化就会触发该断点?

1 个答案:

答案 0 :(得分:3)

我想到了以下想法:

  • 使用依赖项属性创建用户控件。 (实际上不会使用用户控件中的XAML,我们只需要依赖属性。)
  • 将用户控件的依赖项属性绑定到第三方控件的Minimum或Maximum属性(假设它们也是依赖项属性)。
  • 在用户控件的代码隐藏中,将PropertyChangedCallback添加到依赖项属性并在其中删除断点。

此方法应允许您设置在Minimum或Maximum属性更改时触发的断点。但是,我不能保证你会得到一个可以帮助你的堆栈跟踪。

用户控件的代码隐藏可能如下所示:

public partial class DPContainer : UserControl
{
    public static readonly DependencyProperty DebugValueProperty =
        DependencyProperty.Register("DebugValue", typeof(object), typeof(DPContainer), new PropertyMetadata(DebugValue_Changed));

    public DPContainer()
    {
        InitializeComponent();
    }

    public object DebugValue
    {
        get { return GetValue(DebugValueProperty); }
        set { SetValue(DebugValueProperty, value); }
    }

    private static void DebugValue_Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        // Drop a breakpoint in this method.
    }

假设您有一个带有x:Name="someScrollBar"的ScrollBar,您可以在XAML中添加以下内容:

<local:DPContainer DebugValue="{Binding Path=Minimum, ElementName=someScrollBar}" />