Ich versuche, den Offset eines Steuerelements relativ zum oberen Rand seines Fensters zu erhalten, aber ich stehe bei der Verwendung der TransformToAncestor-Methode des Steuerelements in Schwierigkeiten. Hinweis: Dieser Code befindet sich in einem Wertkonverter, der von einem Steuerelement in seine relative Y-Position in Bezug auf das Fenster konvertiert wird.Fehler bei der Verwendung von TransformToAncestor: "Das angegebene Visual ist kein Vorfahr dieses Visual."
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var ctrl = (Control) value;
var win = Window.GetWindow(ctrl);
var transform = ctrl.TransformToAncestor(win); // Exception thrown here.
var pt = transform.Transform(new Point(0, 0));
return pt.Y;
}
Der Aufruf von Window.GetWindow
funktioniert gut und gibt das richtige Fenster-Objekt in dem das Steuerelement befindet.
Bin ich falsch verstanden, was WPF als "Vorfahre" betrachtet? Ich würde denken, dass angesichts des Ergebnisses GetWindow
dieses Fenster ein Vorfahr der Kontrolle wäre. Gibt es bestimmte Verschachtelungsmuster, die dazu führen, dass die Abstammungslinie an einem bestimmten Punkt abgeschnitten wird?
UPDATE:
Es sieht aus wie dies ein Timing-Problem sein kann. Als ich versuchte, die TransformToAncestor
Methode in einem Event-Handler anstatt den Wertkonverter aufzurufen, funktionierte es gut. Es scheint, dass der Wertkonverter ausgeführt werden muss, da bestimmte Elemente instanziiert werden, bevor die Abstammungsbeziehung hergestellt wird.
Nicht sicher, wie man das umgehen kann, da ich versuche, das MVVM-Muster zu verwenden (und daher nicht wirklich Event-Handler verwenden möchte und keine System.Windows-Sachen in meinem ViewModel haben möchte).