gpt4 book ai didi

wpf - VisualTreeHelper.GetChildren 找不到 TabItem 的子项

转载 作者:行者123 更新时间:2023-12-04 14:25:51 28 4
gpt4 key购买 nike

我有以下 C# 代码来查找 DepedendencyObject 的子项:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject parent) where T : DependencyObject
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);

T childType = child as T;
if (childType == null)
{
foreach (var other in FindVisualChildren<T>(child))
yield return other;
}
else
{
yield return (T)child;
}
}
}

当我遍历底部张贴的 XAML 中的 TabItem,将每个 TabItem 传递给上述方法,要求它查找所有扩展器时,它不返回任何内容。此外,我在附加到每个选项卡项的 Loaded 事件的事件处理程序中发出此请求。
















                                <TextBlock Text="Number of Parts" Grid.Column="0"/>                                   
<ComboBox Grid.Column="2"
Margin="0,0,0,2"
/>
</Grid>
</Expander>
<Expander Header="Date/Time Format"
Margin="5,0,5,0"
Padding="3,3,0,0"
IsExpanded="True" >
<Grid Margin="20,4,0,4">
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Date/Time Format" Grid.Row="0"/>
<ComboBox Name="cmbDateTimeFormats"
Grid.Row="0" Grid.Column="2"/>
</Grid>
</Expander>
</StackPanel>
</DockPanel>
</Border>
</TabItem>
<TabItem Header="Profile">
<Border >
<DockPanel LastChildFill="False">
<StackPanel DockPanel.Dock="Top">
<GroupBox Header="Local"
Margin="5,8" Padding="3,3,0,0"
>
<Grid Margin="20,4,0,4">
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />

<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<Button Content="Location..." Grid.Row="0" Name="btnProfLoc" />
<TextBlock Text="{Binding ProfileLocation}" Grid.Row="0" Grid.Column="2"/>

<Button Name="btnSaveProfile" Height="25"
Margin="2,5,0,0" Grid.Row="1"
Padding="2,1" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="Save" Margin="5,0"/>
</StackPanel>
</Button>

<Button Name="btnLoadProfile" Height="25"
Margin="2,5,0,0" Grid.Row="2"
Padding="2,1" >
<StackPanel Orientation="Horizontal">

<TextBlock Text="Load" Margin="5,0"/>
</StackPanel>
</Button>

<Button Name="btnResetProfile" Height="25"
Margin="2,5,0,0" Grid.Row="3"
Padding="2,1" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="Reset" Margin="5,0"/>
</StackPanel>
</Button>
</Grid>
</GroupBox>
</StackPanel>
<StackPanel
DockPanel.Dock="Bottom" Orientation="Horizontal">

</StackPanel>
</DockPanel>
</Border>
</TabItem>
</TabControl>

任何猜测我的方法有什么问题?我还没有在这个特定的自定义控件中尝试过,但是这个方法已被用于在另一个自定义控件中查找给定类型的子项。主要区别在于我要查找的项目是 TabItems 的子项。

最佳答案

选项卡中的控件似乎不是可视化树中 TabItem 的子项。它们是 TabControl 的子项。

如果您将以下代码添加到您的应用程序中,您就会明白我的意思.. 并在选项卡上包含一个按钮,该按钮带有一个报告按钮路径的点击处理程序。

public string Id(object control)
{
if (control is UIElement)
{
string id = ((UIElement)control).GetValue(AutomationProperties.AutomationIdProperty).ToString();
id += "(" + control.GetType().Name + ")";
return id;
}
return "not a ui element";
}

private static T FindParent<T>(DependencyObject child)
where T : DependencyObject
{
if (child == null) return null;
var parent = VisualTreeHelper.GetParent(child);
return parent as T ?? FindParent<T>(parent);
}

public string Path(object control)
{
if ( control == null ) return "";
var path = Id(control);
var parent = FindParent<FrameworkElement>(control as UIElement);
if (parent != null ) path = Path(parent) +"/"+ path;
return path;
}

对于我的应用程序,我得到以下内容:“MainForm(MainPage)/(Grid)/(StackPanel)/TabControl(TabControl)/(Grid)/(Grid)/(Border)/(ContentPresenter)/(StackPanel)/Button(Button )”

注意 TabControl,但没有 TabItem。

如果我连接到 TabItem 本身的事件,我会得到以下路径:“MainForm(MainPage)/(Grid)/(StackPanel)/TabControl(TabControl)/(Grid)/(Grid)/(TabPanel)/MyTabItem(TabItem )”

这表明这些项目不存在于可视化树的 TabItem 中,而是作为 TabControl 的子项。 (这很糟糕。)注意:它们在您更改选项卡时被虚拟化和实现。

关于wpf - VisualTreeHelper.GetChildren 找不到 TabItem 的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116339/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com