【问题标题】:Access sub-controls of custom control from code从代码访问自定义控件的子控件
【发布时间】:2011-04-20 21:32:27
【问题描述】:

我在 Expression Blend 中创建了一个自定义控件,该控件由多个 TextBlocks 组成,这些 TextBlocks 放置在 Grid 中。现在,我将此自定义控件添加到 Visual Studio 中的电话页面,并希望从 C# 代码访问和更改这些 TextBlocks 的文本。

如何在代码中访问这些子控件?

我想我可以这样做:

MyCustomControl.TextBlock1.Text = "New Text";

但这并不容易。那我该怎么做呢?

【问题讨论】:

    标签: c# visual-studio silverlight windows-phone-7 expression-blend


    【解决方案1】:

    属性MyCustomControl.TextBlock1 存在,但它是internal,而不是public。您可以改用MyCustomControl.FindName("TextBlock1") as TextBlock 按名称定位资源。

    【讨论】:

    • 这正是我正在寻找的。成功了,谢谢!
    【解决方案2】:

    GetTemplateChild(string name); 有效吗?您应该能够使用它来访问控件模板的元素

    【讨论】:

    • 不幸的是它返回 null。但即使它有效 - 我在运行时创建了多个这些自定义控件。在这种情况下,使用这个名字对我没有帮助。我需要针对一个特定的控件。
    • 如果它返回 null :这可能是这样的情况:要么你拼错了孩子的名字,要么可能是正确转换类型的问题?
    • 我又试了一次,一次是用 Rick 的FindName 呼叫,一次是用GetTemplateChild,两者都同名。 FindName 成功,GetTemplateChild 返回 null(我省略了转换并查看它是否返回了一个对象 - 它没有)。
    【解决方案3】:

    试试下面的代码都应该满足你的要求:

    Control subControl1 = (Control)MyCustomControl.Controls[0];
    

    TextBox subControl1 = (TextBox)MyCustomControl.Controls[0];
    

    使用任何代码,您都可以访问 Text 属性。 始终记住自定义控件中的层次结构,然后尝试逐级访问所有控件。

    如果您仍然遇到任何问题,请随时提问。

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2011-04-28
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多