2016-10-21 49 views
0

我正在總是空的GetAdornerLayer返回null總是WPF用戶控件

_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas); 

可能是什麼原因。我想獲得AdornerLayer並需要通過添加_AdornerCursor相同

我已經看到了一些可能的答案,它沒有工作對我來說

+1

可能重複[什麼是NullReferenceException,以及如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix -it) – mybirthname

+0

@mybirthname它怎麼可能?請閱讀 –

+0

問題你能提供更多關於xaml和你使用的代碼的細節嗎? –

回答

2

按照documentation你沒有在任何的VisualTree以上AdornerLayer你做InteractiveCanvas。這可能有很多原因。

例如,它可能是您的InteractiveCanvas不在VisualTree中。

var adornerLayer = AdornerLayer.GetAdornerLayer(new Button()); 
// adornerLayer will be null every time. 

背後AdornerLayer.GetAdornerLayer(visual)的邏輯非常簡單:(至少在可見一個像WindowPopup沒有),如果你有這樣的事情這將是這種情況。它只是使用VisualTreeHelper.GetParent(visual)走過VisualTree。如果該父項爲AdornerDecoratorScrollContentPresenter,則它返回該父項的屬性.AdornerLayer(或多或少保證不爲空)。如果它到達VisualTree的根目錄,並且沒有找到這兩種類型的視覺效果,則返回null,就像你的情況一樣。

所以檢查的VisualTree您InteractiveCanvas的使用WPF Tree Visualizer在Visual Studio中,MoleSnoop,並期待在父元素任何AdornerDecoratorScrollContentPresenter。如果你找不到它們,那麼這就是你的問題背後的原因。

如果您不能將您的InteractiveCanvas放入VisualTree中,還可以手動將<AdornerDecorator>元素放置在您的InteractiveCanvas上方某處的XAML中。該元素將創建一個代碼將找到的單獨的AdornerLayer。當然,這可以在C#以及做一些事情就像這樣:

var btn = new Button(); 
var ad = new AdornerDecorator(); 
ad.Child = btn; 
var adornerLayer = AdornerLayer.GetAdornerLayer(btn); 
// adornerLayer will now be NOT null every time. 

底線:檢查父母在你InteractiveCanvas的的VisualTree,你會找到答案。

+0

謝謝您的回答 –

+0

@VisakhVA不客氣。 :-) – haindl