silverlight树形结构区服选择

利用了Silverlight toolkit中的TreeView控件实现了区服选择。

TreeView控件在Silverlight toolkit中,需要去http://silverlight.codeplex.com/ 下载,然后安装,最新版本是5.0的,4.0的也可以下载。

1.引用程序集:System.Windows.Controls.Toolkit.dll

2.新建silverlight子控件页面 childRegionWorld1.xaml

3.在 childRegionWorld1.xaml中的usercontrol 中添加xmlns:toolkit="clrnamespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"

4.放入TreeView控件(完整XAML代码):

<controls:ChildWindow x:Class="SilverlightApplication1.ChildRegionWorld1"
           xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           xmlns:toolkit
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
           Width
="400" Height="300" 
           Title
="区服选择">
    <Grid x:Name="LayoutRoot" Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <controls:TreeView x:Name="tvRegionWorld">
            
        </controls:TreeView>
        <Button x:Name="CancelButton" Content="取消" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
        <Button x:Name="OKButton" Content="确定" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
    </Grid>
</controls:ChildWindow>

5.childRegionWorld1.xaml.cs中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication1
{

    public class Region
    {
        public string RegionID { getset; }
        public string RegionName { getset; }
    }

    public class World
    {
        public string WorldID { getset; }
        public string WorldName { getset; }
        public string RegionID { getset; }
    }

    public partial class ChildRegionWorld1 : ChildWindow
    {
        public ChildRegionWorld1()
        {
            InitializeComponent();
            FillRegionWorldIntoTreeView();
        }

        private void FillRegionWorldIntoTreeView()
        {
            IList<Region> regions = new List<Region> { 
                new Region(){RegionName="一区",RegionID="1"},
                new Region(){RegionName="二区",RegionID="2"}
            };
            IList<World> worlds = new List<World> { 
                new World(){WorldName="一服",WorldID="1",RegionID="1"},
                new World(){WorldName="二服",WorldID="2",RegionID="1"},
                new World(){WorldName="一服",WorldID="1",RegionID="2"},
                new World(){WorldName="二服",WorldID="2",RegionID="2"},
                new World(){WorldName="三服",WorldID="3",RegionID="2"}
            };

            tvRegionWorld.Items.Clear();
            foreach (Region r in regions)
            {
                TreeViewItem item = new TreeViewItem();
                item.IsExpanded = true;

                StackPanel hPanel = new StackPanel();
                hPanel.Orientation = Orientation.Horizontal;
                hPanel.Name = "sp_" + r.RegionID;

                CheckBox hCk = new CheckBox();
                hCk.Click+=new RoutedEventHandler(Region_CheckBox_Click);
                hCk.Name = "ck_" + r.RegionID;
                TextBlock hTb = new TextBlock();
                hTb.Text = r.RegionName;

                hPanel.Children.Add(hCk);
                hPanel.Children.Add(hTb);

                item.Header = hPanel;

                foreach (World w in worlds.Where(w=>w.RegionID==r.RegionID))
                {
                    StackPanel iPanel = new StackPanel();
                    iPanel.Orientation = Orientation.Horizontal;
                    iPanel.Name = "sp_" + r.RegionID+"_"+w.WorldID;

                    CheckBox iCk = new CheckBox();
                    iCk.Click += new RoutedEventHandler(World_CheckBox_Click);
                    iCk.Name = "ck_" + r.RegionID+"_"+w.WorldID;
                    TextBlock iTb = new TextBlock();
                    iTb.Text =w.WorldName;

                    iPanel.Children.Add(iCk);
                    iPanel.Children.Add(iTb);

                    item.Items.Add(iPanel);

                }
                tvRegionWorld.Items.Add(item);
            }

        }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        /// <summary>
        
/// 单服选中时,区必须要选中
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void World_CheckBox_Checked(CheckBox ck)
        {
            StackPanel stackPanel = ck.Parent as StackPanel;
            TreeViewItem item = GetTreeViewItemFromItems(stackPanel.Name);
            StackPanel panel = item.Header as StackPanel;
            UIElement uIE = panel.Children.FirstOrDefault();
            if (uIE != null)
            {
                CheckBox cb = uIE as CheckBox;
                cb.IsChecked = true;
            }
        }

        /// <summary>
        
/// 单服不选中时,如果同区其他服也不选中,那么区就不要选中
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void World_CheckBox_Unchecked(CheckBox ck)
        {
            
            StackPanel stackPanel = ck.Parent as StackPanel;
            TreeViewItem item = GetTreeViewItemFromItems(stackPanel.Name);

            bool result = false;
            foreach (var c in item.Items)
            {
                StackPanel p = c as StackPanel;
                if (p != null && p.Name != stackPanel.Name)
                {
                    CheckBox cb = (p.Children.First()) as CheckBox;
                    result = cb.IsChecked.Value;
                    if (result == truebreak;
                }
            }


            StackPanel panel = item.Header as StackPanel;
            UIElement uIE = panel.Children.FirstOrDefault();
            if (uIE != null)
            {
                CheckBox cb = uIE as CheckBox;
                cb.IsChecked = result;
            }
        }

        /// <summary>
        
/// 区选中时,底下所有的服都选中
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Region_CheckBox_Checked(CheckBox ck)
        {
            CheckOrUnCheckWorlds(ck, true);
        }
        /// <summary>
        
/// 区选不中时,底下所有的服都不选中
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Region_CheckBox_Unchecked(CheckBox ck)
        {
            CheckOrUnCheckWorlds(ck, false);
        }

        private void CheckOrUnCheckWorlds(CheckBox ck,bool IsCheck)
        {
            StackPanel stackPanel = (ck.Parent) as StackPanel;
            string spName = stackPanel.Name;

            TreeViewItem treeViewItem = GetTreeViewItemFromHeader(spName);
            if (treeViewItem != null)
            {
                if (treeViewItem.Items.Count > 0)
                {

                    foreach (var item in treeViewItem.Items)
                    {
                        StackPanel panel = item as StackPanel;
                        foreach (var c in panel.Children)
                        {
                            CheckBox cb = c as CheckBox;
                            if (cb != null)
                            {
                                cb.IsChecked = IsCheck;
                            }
                        }
                    }
                }

            }
        }

        private TreeViewItem GetTreeViewItemFromHeader(string spName)
        {
            foreach (TreeViewItem item in tvRegionWorld.Items)
            { 

                StackPanel stackPanel=(item.Header) as StackPanel;
                if (stackPanel.Name==spName)
                {
                    return item;
                }
            }
            return null;
        }

        private TreeViewItem GetTreeViewItemFromItems(string spName)
        {
            foreach (TreeViewItem item in tvRegionWorld.Items)
            {
                foreach (var c in item.Items)
                {
                    StackPanel stackPanel = c as StackPanel;
                    if (stackPanel.Name == spName)
                    {
                        return item;
                    }
                }
            }
            return null;
        }

        private void World_CheckBox_Click(object sender, RoutedEventArgs e)
        {
            CheckBox ck = sender as CheckBox;
            if (ck.IsChecked.Value)
            {
                World_CheckBox_Checked(ck);
            }
            else
            {
                World_CheckBox_Unchecked(ck);
            }
        }

        private void Region_CheckBox_Click(object sender, RoutedEventArgs e)
        {
            CheckBox ck = sender as CheckBox;
            if (ck.IsChecked.Value)
            {
                Region_CheckBox_Checked(ck);
            }
            else
            {
                Region_CheckBox_Unchecked(ck);
            }
        }
    }
}

7.在MainPage.xaml.cs中写入如下的调用方法:

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            ChildRegionWorld1 child = new ChildRegionWorld1();
            child.Closed += new EventHandler(child_Closed);
            child.Show();
        }

        void child_Closed(object sender, EventArgs e)
        {
            String str = "";
            ChildRegionWorld1 child = sender as ChildRegionWorld1;
            foreach (TreeViewItem item in child.tvRegionWorld.Items)
            {
                foreach (var c in item.Items)
                {
                    StackPanel panel = c as StackPanel;
                    CheckBox cb = panel.Children.First() as CheckBox;
                    if (cb.IsChecked.HasValue && cb.IsChecked.Value)
                    {
                        str += string.Format("{0},",cb.Name);
                    }
                }
            }
            MessageBox.Show(str);
        }

具体运行效果解释如下图所示:(点击区时,区下所有的服都会选中,区下所有的服都不选中时,区也不选中,只要有一个服是选中的,区也会选中)

 

posted @ 2012-04-22 20:19  chenping2008  阅读(946)  评论(0)    收藏  举报