簡體   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