在项目开发中,遇到一大片的CheckBox控件,需要实现全选、反选,一个个写是不太实际的,这时候,我们就可以选择用遍历控件的方式来解决。
全选:遍历的控件是CheckBox,就给它赋值IsChecked= true
反选:遍历的控件是CheckBox,就让它的IsChecked值取反
Xaml的代码就不放出来了,就是一个Grid,Name="content",里面全是CheckBox,后面再加上两个按钮,一个全选,一个反选。
CS:这两个功能基本是一样的,所以我把它们合并成一个方法TraverseControl,再添加一个bool类型的参数isAll来区分
/// <summary>
/// 全选按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckAll_Click(object sender, RoutedEventArgs e)
{
TraverseControl(this.content.Children, true);
}
/// <summary>
/// 反向选择
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void InvertSelection_Click(object sender, RoutedEventArgs e)
{
TraverseControl(this.content.Children, false);
}
由于我在Grid上定义了行和列,content的子元素还不是CheckBox,所以我就多加了一个判断,如果是Grid,再遍历它的子元素
/// <summary>
/// 遍历CheckBox控件
/// </summary>
/// <param name="uiControls">子元素集合</param>
/// <param name="isAll">是否全选</param>
private void TraverseControl(UIElementCollection uiControls,bool isAll)
{
foreach (UIElement element in uiControls)
{
//获取元素名称
switch (element.GetType().Name)
{
//如果是Grid,遍历它的子元素
case "Grid":
TraverseControl((element as Grid).Children, isAll);
break;
case "CheckBox":
//全选
if (isAll)
{
(element as CheckBox).IsChecked = true;
break;
}
//反选
(element as CheckBox).IsChecked = !(element as CheckBox).IsChecked;
break;
}
}
}