【问题标题】:Silverlight 4: How to access control created from codebehindSilverlight 4:如何访问从代码隐藏创建的控制
【发布时间】:2011-05-25 22:30:49
【问题描述】:

我正在尝试创建一种在两个用户控件之间绘制线条(路径)的方法。我发现有人给我一个关于如何做到这一点的一般指示的帖子,我成功地实现了代码并开始根据我的需要调整它。

我在访问用户控件时遇到问题:

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);

谁能告诉我如何访问这些用户控件?

【问题讨论】:

  • Parent 的错误是什么?
  • 'System.Windows.UIElement' 不包含'Parent' 的定义,并且找不到接受'System.Windows.UIElement' 类型的第一个参数的扩展方法'Parent'(你是缺少 using 指令或程序集引用?)
  • 当我使用第一个示例时一切正常,但我根据数据库数据创建按钮控件,例如,我可能需要 30 个按钮。

标签: silverlight silverlight-4.0


【解决方案1】:

这条线应该可以工作:-

var transfrom3 = canvas1.Children[0].TransformToVisual(canvas1.Children[0].Parent as FrameworkElement);

正如您所发现的,UIElement 没有 Parent,它的 FrameworkElement 添加了 Parent 属性。

但是,最好通过控件的名称来访问控件(我假设您将 Name 分配给动态添加的控件)。

这个:-

var p1 = this.FindName(ps.ProcessID.ToString());

假设thisUserControl 并且相关的FrameworkElement 在代码 中被赋予了匹配的名称,应该可以工作:-

canvas1.Children.Add(new Button() {Name = ps.ProcessID.ToString(), Content="Hello"});

【讨论】:

  • 感谢安东尼的详细解释!我会尽快试试这个!
  • 这样做仍然不会让我访问 .Parent 并且是的,我在添加控件时命名控件,顺便说一句,我们在这里讨论的用户控件是一个 Stackpanel,其中包含多个项目。我想要做的是在两个对象之间画一条线/路径,我从另一个问题中得到了代码,但是为了让它工作,我需要能够访问该行中的 .Parent。
【解决方案2】:

嗯,我没有看到您将 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。

感谢安东尼的回答!

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 2017-06-27
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2015-03-01
    • 2010-11-01
    相关资源
    最近更新 更多