相关疑难解决方法(0)

使用TransformToAncestor时出错:"指定的Visual不是此Visual的祖先."

我试图获得控件相对于窗口顶部的偏移量,但是在使用控件的TransformToAncestor方法时遇到了麻烦.注意:此代码位于值转换器中,该转换器将从控件转换为相对于窗口的相对Y位置.

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;
}
Run Code Online (Sandbox Code Playgroud)

调用Window.GetWindow工作正常,并返回控件所在的正确窗口对象.

我误解了WPF认为的"祖先"吗?我认为,鉴于结果GetWindow,该窗口将成为控制的祖先.是否有某些嵌套图案会导致某一系列的血统被切断?

更新:

看起来这可能是一个时间问题.当我尝试TransformToAncestor在事件处理程序而不是值转换器中调用方法时,它工作得很好.似乎值转换器必须运行,因为在建立祖先关系之前实例化某些元素.

不知道如何解决这个问题,因为我正在尝试使用MVVM模式(因此我并不真的想使用事件处理程序,而是宁愿在我的ViewModel中没有System.Windows的东西).

wpf

6
推荐指数
1
解决办法
4710
查看次数

标签 统计

wpf ×1