2016-10-21 2 views
0

ich fürGetAdornerLayer gibt null zurück, immer für WPF Usercontrol

immer null
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas); 

bin immer, was der Grund sein könnte. Ich wollte AdornerLayer bekommen und brauchen eine _AdornerCursor über die gleiche hinzufügen

ich einige mögliche Antworten gesehen haben und es hat nicht funktioniert für mich

+1

Mögliche Duplikate von [Was ist eine NullReferenceException, und wie behebe ich es?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix -it) – mybirthname

+0

@mybirthname wie könnte es sein? Bitte lesen Sie die Frage –

+0

Könnten Sie mehr Details über das XAML und den Code, die Sie verwenden, bereitstellen? –

Antwort

2

Nach dem documentation Sie keine AdornerLayer im VisualTree haben über Ihre InteractiveCanvas. Dies kann einige Gründe haben.

Zum Beispiel könnte es sein, dass Ihr InteractiveCanvas noch nicht in einem VisualTree ist. (. Zumindest nicht in einem sichtbar man wie ein Window oder Popup) Das wäre der Fall, wenn Sie so etwas wie diese:

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

Die Logik hinter AdornerLayer.GetAdornerLayer(visual) ist sehr einfach. Es geht einfach den VisualTree mit hinauf. Wenn dieses übergeordnete Element ein AdornerDecorator oder ein ist, gibt es die Eigenschaft .AdornerLayer dieses übergeordneten Elements zurück (die mehr oder weniger garantiert nicht null ist). Wenn es in den Stamm von VisualTree gelangt und keine der beiden Arten von Visualisierungen gefunden hat, gibt es null wie in Ihrem Fall zurück.

überprüfen So die VisualTree Ihrer InteractiveCanvas die WPF Tree Visualizer in Visual Studio verwenden, Mole oder Snoop und halten Sie Ausschau nach einem der AdornerDecorator oder ScrollContentPresenter in den übergeordneten Elemente. Wenn Sie keine von ihnen finden, ist dies genau der Grund für Ihr Problem.

Wenn Sie nicht Ihr InteractiveCanvas in einem VisualTree noch setzen können, wäre es auch möglich sein, manuell ein <AdornerDecorator> Element in der XAML über die InteractiveCanvas irgendwo zu platzieren. Dieses Element erstellt einen separaten AdornerLayer, den Ihr Code finden wird. Dies kann natürlich in C# getan werden, auch etwas zu tun, wie folgt aus:

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

Fazit: Überprüfen Sie die Eltern in der VisualTree Ihrer InteractiveCanvas und Sie erhalten die Antwort finden.

+0

Vielen Dank für Ihre Antwort –

+0

@VisakhVA Gern geschehen. :-) – haindl

Verwandte Themen