現在のユーザー コントロールのすべての要素を含むリストを取得したいと考えています。LogicalTree の要素だけでなく、ユーザー コントロールで定義および使用されているデータ テンプレート内のすべての要素。
iam の反復処理で VisualTree がスローされた場合、ContentControl 内に VisualTree 項目がありません。VisualTree にはすべての要素が含まれていると思いましたか?
最後に、リストの DataTemplate 内に TextBox と Button が必要です。しかし、要素の x:Name がわかりません。
誰か助けてくれませんか?
<UserControl
x:Class="DataTemplate.Test"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot">
<ContentControl>
<ContentControl.ContentTemplate>
<DataTemplate>
<Grid VerticalAlignment="Stretch">
<Button x:Name="btn_1" />
<TextBlock x:Name="tb_1" />
</Grid>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</Grid>
</UserControl>
コードでは、 UserControl.Loaded イベントが発生したときにそれを繰り返しスローしました...
public void OnUserControlLoaded(object sender, EventArgs e)
{
BindChildren(LayoutRoot);
}
List<object> list = new List<object>();
private void BindChildren(object target) {
try
{
var count = VisualTreeHelper.GetChildrenCount(target as FrameworkElement);
if(count < 1)
{
foreach (var child in LogicalTreeHelper.GetChildren(_currentElement))
{
list.Add(child);
BindChildren(child);
}
}
else
{
for (int i = 0; i < count; i++)
{
list.Add(VisualTreeHelper.GetChild(target as FrameworkElement, i));
BindChildren(VisualTreeHelper.GetChild(target as FrameworkElement, i));
}
}
}
catch (InvalidCastException exc)
{
throw;
}
}