繁体   English   中英

WPF TransformToAncestor错误

[英]WPF TransformToAncestor error

我有以下代码

public partial class MyControl : UserControl
{
    ...
    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        if (DataContext is MyViewModel)
        {
            var vm = DataContext as CameraViewModel;
            var p = Parent as FrameworkElement;
            while (!(p is Window))
                p = p.Parent as FrameworkElement;

            vm.GetTransform = () => TransformToAncestor(p);
        }
    }

}

在我的视图模型中,我有一个命令处理程序代码,当单击用户控件中的按钮时执行。

public Func<GeneralTransform> GetTransform { private get; set; }
private void OnMyCommand(object parameter){
    var p = GetTransform().Transform(new Point(0,0));
}

但是上面的代码不起作用,如GetTransform()调用所述

The specified Visual is not an ancestor of this Visual.

我认为上面的代码已经确保p是控件的窗口祖先,但是为什么我仍然会收到此错误?

感谢@Brian Reichle的评论,我找出了原因并解决了。

事实证明,我在选项卡控件的不同选项卡中具有相同的控件。

您应该知道,始终只有一个选项卡可以处于活动状态。 这些控件属于当前不活动的选项卡,属于不具有窗口祖先的不同可视树。

就我而言,这就是发生的事情:我回溯逻辑树以找出Window对象,但是this对象属于某些不可见的选项卡,并且没有将该Window作为其可视祖先。

一旦意识到这一点,解决方案就不再是附加Loaded事件,而是附加IsVisibleChanged事件。

    private void UserControl_IsVisibleChanged(object sender, 
        DependencyPropertyChangedEventArgs e)
    {
        if (!(bool)e.NewValue)
            return;
        if (DataContext is CameraViewModel)
        {
            SaveTransform();
        }
        else Dispatcher.InvokeAsync(SaveTransform);
    }

    private void SaveTransform()
    {
        var vm = DataContext as CameraViewModel;
        var w = VisualTreeHelper.GetParent(this) as FrameworkElement;
        while (w != null && !(w is Window))
            w = VisualTreeHelper.GetParent(w) as FrameworkElement;
        if (w != null)
        {
            vm.GetTransform = () => TransformToAncestor(w);
        }
    }

注意:在IsVisibleChanged事件的第一次启动中,可能尚未设置数据上下文。 因此,以上代码必须稍后SaveTransform代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM