Visual Tree中缺少自定义控件中的嵌套元素

时间:2011-09-06 14:28:19

标签: silverlight silverlight-4.0

我对自定义控件有两个问题:

我创建了一个自定义UserControl

public partial class MyControl : UserControl
{
public static DependencyProperty ControlProperty = DependencyProperty.Register("Control", typeof(UIElement), typeof(MyControl ), null);

 public UIElement Control
        {
            get { return GetValue(ControlProperty) as UIElement; }
            set { SetValue(ControlProperty,value); }
        }
}

现在我想使用XAML将任何“常规”控件嵌入到我的控件中

<Grid>
<own:MyControl>
<own:MyControl.Control>
<TextBox x:Name="txtTest" />
</own:MyControl.Control>
</own:MyControl>  
</Grid>

1)当尝试在代码隐藏中通过其名称访问TextBox时,我不能,因为它是null。问题可能是什么?如果我将相同的TextBox放在Grid中,名称将按原样解析为实例。

2)我找不到使用VisualTreeHelper的课程。 GetChild 方法只是假装我的控件不在那里。为什么会这样?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

VisualTreeHelper根本不是“假装”。 Visual Tree中MyControl.Control属性的值为。只是出现在Xaml中并不意味着它会被添加到可视树中。

仅当控件作为已存在于Visual Tree中的UI元素的子元素(如Panel,ContentControl或Border)添加时,它才会成为可视树的一部分。

你可以这样做: -

<Grid>
  <own:MyControl x:Name="myControl">
    <own:MyControl.Control>
      <TextBox x:Name="txtTest" />
    </own:MyControl.Control>
  </own:MyControl>  
</Grid>

在代码隐藏中: -

txtTest = myControl.Control as TextBox;

可能不是你想要做的,所以你要做的是什么?