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