[英]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.