我正在總是空的GetAdornerLayer返回null總是WPF用戶控件
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);
可能是什麼原因。我想獲得AdornerLayer
並需要通過添加_AdornerCursor
相同
我已經看到了一些可能的答案,它沒有工作對我來說
我正在總是空的GetAdornerLayer返回null總是WPF用戶控件
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);
可能是什麼原因。我想獲得AdornerLayer
並需要通過添加_AdornerCursor
相同
我已經看到了一些可能的答案,它沒有工作對我來說
按照documentation你沒有在任何的VisualTree以上AdornerLayer
你做InteractiveCanvas
。這可能有很多原因。
例如,它可能是您的InteractiveCanvas
不在VisualTree中。
var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.
背後AdornerLayer.GetAdornerLayer(visual)
的邏輯非常簡單:(至少在可見一個像Window
或Popup
沒有),如果你有這樣的事情這將是這種情況。它只是使用VisualTreeHelper.GetParent(visual)
走過VisualTree。如果該父項爲AdornerDecorator
或ScrollContentPresenter
,則它返回該父項的屬性.AdornerLayer
(或多或少保證不爲空)。如果它到達VisualTree的根目錄,並且沒有找到這兩種類型的視覺效果,則返回null
,就像你的情況一樣。
所以檢查的VisualTree您InteractiveCanvas
的使用WPF Tree Visualizer在Visual Studio中,Mole或Snoop,並期待在父元素任何AdornerDecorator
或ScrollContentPresenter
。如果你找不到它們,那麼這就是你的問題背後的原因。
如果您不能將您的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,你會找到答案。
謝謝您的回答 –
@VisakhVA不客氣。 :-) – haindl
可能重複[什麼是NullReferenceException,以及如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix -it) – mybirthname
@mybirthname它怎麼可能?請閱讀 –
問題你能提供更多關於xaml和你使用的代碼的細節嗎? –