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

问题描述:

我们的Silverlight应用程序包含第三方控件,其中包含一些滚动条(除其他外)。为了解决问题,我希望能够在第三方控件修改任何滚动条的最小或最大属性时停止在调试器中。然后,我可以查看堆栈跟踪并了解更多关于正在发生的事情。如何在“依赖项属性已更改”上设置断点?

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

我跑过一篇博客文章,谈到using DependencyPropertyDescriptor to get dependency property change events,但不幸的是,DependencyPropertyDescriptor在Silverlight中不存在。

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

+0

类似的问题:http://stackoverflow.com/q/240156 –

以下想法弹簧在我的脑海:

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

这种方法应该允许你设置一个断点,当最小或最大属性发生变化时触发。不过,我不能保证你会得到一个帮助你的堆栈跟踪。

用户控件的代码隐藏可能看起来是这样的:

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"一个滚动条,然后你可以添加类似下面给您的XAML:

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

滚动条是第三方控件的模板的一部分,所以我不能用ElementName绑定到它。不过,我可能能够在代码中创建绑定。 –