在WPF中,我有一个像这样的结构
<Button>
<Grid>
<!--definitions for 1 row and 2 columns-->
<TextBlock x:Name="t1" Grid.Column="0"/>
<TextBlock x:Name="t2" Grid.Column="1"/>
</Grid>
</Button>
假设具有此结构的Button b
是动态生成的。如何从t1
访问Button b
?
编辑以澄清:由于t1
位于Button b
内,如果只有t1
访问权限,是否可以更改b
的内容? b.childGridElement.childTextBlock_t1.Text = "newString"
答案 0 :(得分:2)
这适用于您提供的用例:
((TextBlock)b.FindName("t1")).Text = "newString";
答案 1 :(得分:2)
您需要使用Visual Tree Helper。
定义处理程序扩展方法
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject parent) where T : DependencyObject
{
if (parent != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
// If the available child is not null and is of required Type<T> then return with this child else continue this loop
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
现在你的xaml
IEnumerable<TextBlock> textblockes=FindVisualChildren<TextBlock>(b);
foreach (var textblock in textblockes)
{
if (textblock!= null && textblock.Name="t1")
{
//write code for t1 here;
}
if (textblock!= null && textblock.Name="t2")
{
//write code for t2 here;
}
}
在上面的方法中,无论你的树结构如何,它都会找到你按钮b的所有文本块,然后根据Name属性你可以进行适当的操作。