如何使用 WPF 在 TabControl 中循环检查复选框?
How to Loop Through CheckBoxes in a TabControl using WPF?
我正在尝试遍历选项卡控件的子元素以了解哪些复选框设置为已选中或未选中。我在 SO 上找到了各种答案,但我似乎无法让代码执行我需要的操作。这是我到目前为止所拥有的:
foreach (System.Windows.Controls.TabItem page in this.MainWindowTabControl.Items)
{
if(VisualTreeHelper.GetChild(page, 0).GetType() == typeof(System.Windows.Controls.Grid))
{
var grid = VisualTreeHelper.GetChild(page, 0);
int gridChildCount = VisualTreeHelper.GetChildrenCount(grid);
for(int i = 0; i < gridChildCount; i++)
{
if(VisualTreeHelper.GetChild(grid, i).GetType() == typeof(CheckBox))
{
CheckBox box = (CheckBox)VisualTreeHelper.GetChild(grid, i);
if (boxer.IsChecked == true)
checkboxes.Add(box);
}
}
//do work
}
}
很可能,我对 VisualTreeHelper class 的工作方式有错误的思考。我想我可以通过 XAML 代码继续工作,以继续深入到选项卡控件的子项中吗?目前,我的 WPF xaml 代码如下所示:
<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left" Height="470"
Margin="0,10,0,0" VerticalAlignment="Top" Width="1384">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5" Margin="0,-21,0,0">
<CheckBox Name="testBox" Content="Check Box"
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="1293,50,0,0"/>
</Grid>
</TabItem>
</TabControl>
所以,我的理解是我必须逐个子工作,也就是说,使用 VisualTreeHelper 获取选项卡控件的子项(select 选项卡项),然后获取 TabItem 的子项(select grid),然后获取Grid的children,然后我终于可以遍历children(checkboxes)来获取我想要的信息了。如果我弄错了,有人可以解释我哪里出错了吗?
EDIT: Changed Checkbox XAML to the proper code
据我所知,没有必要像您现在所做的那样从 parent 中获取 children。你可以使用LogicalTreeHelperclass。它会让你通过 GetChildren
方法查询 objects。
您的代码应如下所示:
XAML:
<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left"
Margin="0,10,0,0" VerticalAlignment="Top" Height="181" Width="247">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5" Margin="0,-21,0,0" x:Name="gridChk">
<CheckBox x:Name="testBox" Content="Check Box"
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,50,0,0"/>
</Grid>
</TabItem>
</TabControl>
C#:
List<CheckBox> boxesList = new List<CheckBox>();
//The named Grid, and not TabControl
var children = LogicalTreeHelper.GetChildren(gridChk);
//Loop through each child
foreach (var item in children)
{
var chkCast = item as CheckBox;
//Check if the CheckBox object is checked
if (chkCast.IsChecked == true)
{
boxesList.Add(chkCast);
}
}
我正在尝试遍历选项卡控件的子元素以了解哪些复选框设置为已选中或未选中。我在 SO 上找到了各种答案,但我似乎无法让代码执行我需要的操作。这是我到目前为止所拥有的:
foreach (System.Windows.Controls.TabItem page in this.MainWindowTabControl.Items)
{
if(VisualTreeHelper.GetChild(page, 0).GetType() == typeof(System.Windows.Controls.Grid))
{
var grid = VisualTreeHelper.GetChild(page, 0);
int gridChildCount = VisualTreeHelper.GetChildrenCount(grid);
for(int i = 0; i < gridChildCount; i++)
{
if(VisualTreeHelper.GetChild(grid, i).GetType() == typeof(CheckBox))
{
CheckBox box = (CheckBox)VisualTreeHelper.GetChild(grid, i);
if (boxer.IsChecked == true)
checkboxes.Add(box);
}
}
//do work
}
}
很可能,我对 VisualTreeHelper class 的工作方式有错误的思考。我想我可以通过 XAML 代码继续工作,以继续深入到选项卡控件的子项中吗?目前,我的 WPF xaml 代码如下所示:
<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left" Height="470"
Margin="0,10,0,0" VerticalAlignment="Top" Width="1384">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5" Margin="0,-21,0,0">
<CheckBox Name="testBox" Content="Check Box"
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="1293,50,0,0"/>
</Grid>
</TabItem>
</TabControl>
所以,我的理解是我必须逐个子工作,也就是说,使用 VisualTreeHelper 获取选项卡控件的子项(select 选项卡项),然后获取 TabItem 的子项(select grid),然后获取Grid的children,然后我终于可以遍历children(checkboxes)来获取我想要的信息了。如果我弄错了,有人可以解释我哪里出错了吗?
EDIT: Changed Checkbox XAML to the proper code
据我所知,没有必要像您现在所做的那样从 parent 中获取 children。你可以使用LogicalTreeHelperclass。它会让你通过 GetChildren
方法查询 objects。
您的代码应如下所示:
XAML:
<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left"
Margin="0,10,0,0" VerticalAlignment="Top" Height="181" Width="247">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5" Margin="0,-21,0,0" x:Name="gridChk">
<CheckBox x:Name="testBox" Content="Check Box"
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,50,0,0"/>
</Grid>
</TabItem>
</TabControl>
C#:
List<CheckBox> boxesList = new List<CheckBox>();
//The named Grid, and not TabControl
var children = LogicalTreeHelper.GetChildren(gridChk);
//Loop through each child
foreach (var item in children)
{
var chkCast = item as CheckBox;
//Check if the CheckBox object is checked
if (chkCast.IsChecked == true)
{
boxesList.Add(chkCast);
}
}