Pencerenin üst kısmına göre bir denetimin ofsetini almaya çalışıyorum, ancak kontrolün TransformToAncestor yöntemini kullanırken sorun yaşıyorum. Not: Bu kod, bir kontrolden pencereye göreceli olarak ilgili Y pozisyonuna dönüşecek bir değer dönüştürücüsündedir.TransformToAncestor kullanırken hata: "Belirtilen Görsel bu Görsel'in atası değildir."
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;
}
Window.GetWindow
çalışmalara çağrı gayet güzel ve doğru pencere nesnesi içindeki denetimin bulunduğu döndürür.
WPF'nin bir "atası" olarak ne düşündüğünü yanlış anladım mı? GetWindow
sonucuna göre, bu pencerenin kontrolün atası olacağını düşünürdüm. Ataların soyunun belirli bir noktada kesilmesine neden olabilecek belirli yuvalama paternleri var mı?
GÜNCELLEME: Bu bir zamanlama sorunu olabilir gibi
görünüyor. TransformToAncestor
yöntemini, değer dönüştürücüsünden ziyade bir olay işleyicisine çağırmayı denediğimde, yalnızca iyi çalıştı. Atalara ait ilişki kurulmadan önce belirli unsurlar ortaya çıktıkça, değer dönüştürücünün çalıştığı anlaşılmaktadır.
MVVM desenini kullanmaya çalıştığımdan (ve bu nedenle gerçekten olay işleyicilerini kullanmak istemediğimden ve ViewModel öğesinde System.Windows öğelerinin olmasını istemediğinden) bu konuda nasıl emin olacağımı bilmiyorum.