2011-09-16 115 views
4

我們的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 –

回答

3

以下想法彈簧在我的腦海:

  • 創建一個依賴屬性的用戶控件。 (用戶控件中的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綁定到它。不過,我可能能夠在代碼中創建綁定。 –

相關問題