Silverlight 可视化树中缺少自定义控件中的嵌套元素

Silverlight 可视化树中缺少自定义控件中的嵌套元素,silverlight,silverlight-4.0,Silverlight,Silverlight 4.0,关于自定义控件,我确实有两个问题: 我创建了一个自定义用户控件 public partial class MyControl : UserControl { public static DependencyProperty ControlProperty = DependencyProperty.Register("Control", typeof(UIElement), typeof(MyControl ), null); public UIElement Control

关于自定义控件,我确实有两个问题:

我创建了一个自定义用户控件

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) 当试图通过代码隐藏中的名称访问文本框时,我就是做不到,因为它是空的。问题可能是什么?如果我将相同的文本框放在网格中,那么名称将解析为实例

2) 我无法使用VisualTreeHelper找到我的类。GetChild方法只是假装我的控件不在那里。为什么会发生这种情况

提前谢谢你

VisualTreeHelper根本不是“假装”。
MyControl.Control
属性的值在可视化树中为而非。仅存在于Xaml中并不意味着它将被添加到可视化树中

只有当控件作为已经在可视化树中的UI元素(如面板、ContentControl或边框)的子元素添加时,它才会成为可视化树的一部分

您可以这样做:-

<Grid>
  <own:MyControl x:Name="myControl">
    <own:MyControl.Control>
      <TextBox x:Name="txtTest" />
    </own:MyControl.Control>
  </own:MyControl>  
</Grid>
可能不是你想做的,那么你想做的是什么?

VisualTreeHelper根本不是“假装”的。
MyControl.Control
属性的值在可视化树中为而非。仅存在于Xaml中并不意味着它将被添加到可视化树中

只有当控件作为已经在可视化树中的UI元素(如面板、ContentControl或边框)的子元素添加时,它才会成为可视化树的一部分

您可以这样做:-

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

可能不是您想要做的,那么您想要做的是什么?

不,控件是包装器,它根据上下文更改一些属性和样式。它需要包含在现有的XAML代码中,因此控件需要像以前一样从代码隐藏处可用——只需按其名称即可。如何以面板的方式更改控件?@Muffel:作为面板,您希望控制多个控件的测量和排列,还是只希望包装一个子控件(请记住控件本身可以是网格等,包含其他控件)?我有两个属性,但是,如果没有复杂化,可以考虑IQueDype类型的一个属性,非常类似于Panel类的子属性。这些元素在内部添加到常规栅格中。添加到网格后,将在每个控件上设置一些DependencyProperty。对我来说真正重要的是,我可以将其包含到现有的XAML中,并仅通过名称访问每个包含控件的控件。有没有(简单的)方法来实现这一点?没有,控件是一个包装器,它根据上下文改变一些属性和样式。它需要包含在现有的XAML代码中,因此控件需要像以前一样从代码隐藏处可用——只需按其名称即可。如何以面板的方式更改控件?@Muffel:作为面板,您希望控制多个控件的测量和排列,还是只希望包装一个子控件(请记住控件本身可以是网格等,包含其他控件)?我有两个属性,但是,如果没有复杂化,可以考虑IQueDype类型的一个属性,非常类似于Panel类的子属性。这些元素在内部添加到常规栅格中。添加到网格后,将在每个控件上设置一些DependencyProperty。对我来说真正重要的是,我可以将其包含到现有的XAML中,并仅通过名称访问每个包含控件的控件。有没有(简单的)方法来实现这一点?