我对自定义控件有两个问题:
我创建了一个自定义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 方法只是假装我的控件不在那里。为什么会这样?
提前谢谢!
答案 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;
可能不是你想要做的,所以你要做的是什么?