我正在尝试创建一个方法来在两个UserControl之间绘制一条线(路径)。我发现某人的帖子给了我关于如何执行此操作的一般指针,我成功地实现了代码并开始根据我的需要进行调整。
我在访问用户控件时遇到问题:
Button b2 = new Button();
var transform2 = b2.TransformToVisual(b2.Parent as UIElement);
按预期工作,但我的按钮是通过方法动态创建的,因此我无法将其作为“b2”访问。
我尝试了以下内容:
var transfrom3 = canvas1.Children[0].TransformToVisual(canvas1.Children[0].Parent as UIElement);
但是像这样访问它会在.Parent上给我一个错误。
如果还尝试过:
var p1 = this.FindName(ps.ProcessID.ToString());
var p2 = this.FindName(ps.PreID.ToString());
////get geo data from both controls
var transform1 = p1.TransformToVisual(p1.Parent as UIElement);
var transform2 = p2.TransformToVisual(p2.Parent as UIElement);
有谁能告诉我如何访问这些UserControl?
答案 0 :(得分:0)
这条线应该起作用: -
var transfrom3 = canvas1.Children[0].TransformToVisual(canvas1.Children[0].Parent as FrameworkElement);
因为您发现UIElement
没有Parent
,而FrameworkElement
添加了Parent
属性。
然而,通过其名称访问控件会更好(我假设您正在为动态添加的控件分配Name
)。
此: -
var p1 = this.FindName(ps.ProcessID.ToString());
应该假设this
为UserControl
并且有问题的FrameworkElement在代码中被赋予了匹配的名称: -
canvas1.Children.Add(new Button() {Name = ps.ProcessID.ToString(), Content="Hello"});
答案 1 :(得分:0)
嗯,我没有看到您将UIElement更改为FrameworkElement,此设置现在适用于我:
var control1 = this.FindName(ps.ProcessID.ToString()) as FrameworkElement;
var control2 = this.FindName(ps.PreID.ToString()) as FrameworkElement;
var transform1 = control1.TransformToVisual(control1.Parent as UIElement);
var transform2 = control2.TransformToVisual(control2.Parent as UIElement);
如果我将控件作为FrameworkElement添加到var中,那么我可以再次使用控件上的.Parent。
感谢你的回答安东尼!