WPF 下拉树用户控件实现

 公司业务需要下拉选择树,并且实现中文简写检索,在网上找了资源发现没有,所以自己尝试写了个简易版本的,混脸熟。 废话不多说直接贴代码

XAML代码:

<UserControl x:Class="RFID.WW.CardSender.Windows.Paging.MyComboBox1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RFID.WW.CardSender.Windows.Paging"
             mc:Ignorable="d" Height="115.333" Width="200">
    <Grid Margin="15">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="14*"/>
            <ColumnDefinition Width="53*"/>
            <ColumnDefinition Width="9*"/>
            <ColumnDefinition Width="42*"/>
            <ColumnDefinition Width="52*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="25" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <TextBox MouseLeave="header_MouseLeave"  Grid.Row="0"  x:Name="header" Margin="-15,-15,-15,14"  PreviewMouseDown="header_PreviewMouseDown" TextChanged="header_TextChanged" Grid.ColumnSpan="5" RenderTransformOrigin="0.26,1.141" />
        <Popup  MouseEnter="PopupTest_MouseEnter" MouseLeave="PopupTest_MouseLeave"   PlacementTarget="{Binding ElementName=header}" x:Name="PopupTest" AllowsTransparency="True" IsOpen="False" Grid.ColumnSpan="5" Margin="0,16,0,-300" Grid.RowSpan="2">
            <TreeView Height="300" BorderBrush="Black" BorderThickness="1" Background="#EFEFEF"  x:Name="departmentTree" SelectedItemChanged="Tree1_SelectedItemChanged">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate  ItemsSource="{Binding Nodes}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding deptName}" Margin="2,0,0,0"></TextBlock>
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Popup>

    </Grid>
</UserControl>
后台代码:

namespace RFID.WW.CardSender.Windows.Paging
{
    /// <summary>
    /// MyComboBox1.xaml 的交互逻辑
    /// </summary>
    public partial class MyComboBox1 : UserControl
    {
        public delegate TreeViewModel HandSelectItemChange(object obj);
        public event HandSelectItemChange SelectItemChange;

        public TreeViewModel SelectItem;
        List<TreeViewModel> treedata;
        bool isPreviewMouseDown = false;
        public MyComboBox1()
        {
            InitializeComponent();
            init();
        }
        void init()
        {
            try
            {
                List<TreeViewModel> data = ServiceManagement.Instance.GetDepartment1();//数据绑定
                                                                                       this.combobox.DataContext = data;
                treedata = data;
                this.departmentTree.ItemsSource = treedata;
            }
            catch (Exception)
            {

            }
        }
        public void Clear() {
            this.header.Text = "";
            PopupTest.IsOpen = false;
            //var xx = this.departmentTree.SelectedItem;
            //if (xx != null)
            //{
            //    var u = this.departmentTree.ItemContainerGenerator.ContainerFromItem(xx);
            //    var data = u as TreeViewItem;

            //    data.IsSelected = false;
            //    SelectItem = null;
            //}
            //else
            //{
            //    SelectItem = null;
            //}
        }
        public void LoadItem(string depide)
        {
            //object temp = null;
            //foreach (var item in departmentTree.Items)
            //{
            //    TreeViewModel model = item as TreeViewModel;
            //    if (model.uuid.Equals(depide)) {
            //        temp = item;
            //    }

            //}
            //if (temp != null) {
            //    departmentTree.s
            //}
        }
        private void Window_MouseEnter(object sender, MouseEventArgs e)
        {

        }

        private void Tree1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (!istextchanged)
            {
                var item = departmentTree.SelectedItem;

                if (item != null)
                {
                    TreeViewModel model = item as TreeViewModel;
                    if (model != null)
                    {
                        textchanged = false;
                        SelectItem = model;
                        header.Text = model.deptName;
                        if (SelectItemChange != null)
                        {
                            SelectItemChange(this);
                        }
                        textchanged = true;
                    }
                }
                PopupTest.IsOpen = false;
                isPreviewMouseDown = false;
            }
        }
        bool textchanged = true;
        bool istextchanged = false;
        private void Tree1_Initialized(object sender, EventArgs e)
        {
            var trv = sender as TreeView;
            var trvItem = new TreeViewItem() { Header = "Initialized item" };
            var trvItemSel = trv.Items[1] as TreeViewItem;
            trvItemSel.Items.Add(trvItem);
            //List<TreeViewModel> data = ServiceManagement.Instance.GetDepartment1();//数据绑定
            this.combobox.DataContext = data;
            //this.departmentTree.ItemsSource = data;
        }

        private void header_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            isPreviewMouseDown = true;
            PopupTest.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;

            PopupTest.VerticalOffset = header.VerticalOffset + 25;
            PopupTest.HorizontalOffset = header.HorizontalOffset;
            PopupTest.StaysOpen = true;
            //PopupTest.Height = departmentTree.Height;
            PopupTest.Width = this.Width;

            PopupTest.IsOpen = true;
        }

        private void header_TextChanged(object sender, TextChangedEventArgs e)
        {
            PopupTest.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
            PopupTest.VerticalOffset = header.VerticalOffset + 25;
            PopupTest.HorizontalOffset = header.HorizontalOffset;
            PopupTest.StaysOpen = true;
            PopupTest.Width = this.Width;
            if (textchanged)
            {
                isPreviewMouseDown = true;
                istextchanged = true;


                var text = this.header.Text;
                if (string.IsNullOrWhiteSpace(text))
                {
                    this.departmentTree.ItemsSource = treedata;
                    var xx = this.departmentTree.SelectedItem;
                    if (xx != null)
                    {
                        var u = this.departmentTree.ItemContainerGenerator.ContainerFromItem(xx);
                        var data = u as TreeViewItem;

                        data.IsSelected = false;
                        SelectItem = null;
                    }
                    else
                    {
                        SelectItem = null;
                    }

                }
                else
                {
                    var data = GetListTreeModel(treedata, text);
                    if (data.Count > 0)
                    {
                        this.departmentTree.ItemsSource = data;
                        var xx = this.departmentTree.SelectedItem;
                        if (xx != null)
                        {
                            var u = this.departmentTree.ItemContainerGenerator.ContainerFromItem(xx);
                            var d = u as TreeViewItem;
                            d.IsSelected = false;
                            SelectItem = null;
                        }
                        else
                        {
                            SelectItem = null;
                        }
                    }
                }
                istextchanged = false;
                //var item = departmentTree.SelectedItem as TreeViewItem;
                //item.IsSelected = false;
                PopupTest.IsOpen = true;
            }
        }


        List<TreeViewModel> GetListTreeModel(List<TreeViewModel> treedata, string text)
        {
            List<TreeViewModel> treeViewModels = new List<TreeViewModel>();

            foreach (TreeViewModel item in treedata)
            {
                OperateTree(item, treeViewModels, text);
                //if (item.deptName.IndexOf(text) >= 0 || GetPYString(item.deptName).ToUpper().IndexOf(text.ToUpper()) >= 0)
                //{
                //    treeViewModels.Add(item);
                //}
            }
            return treeViewModels;
        }
        public void OperateTree(TreeViewModel item, List<TreeViewModel> treeViewModels, string text)
        {
            if (item.deptName.IndexOf(text) >= 0 || GetPYString(item.deptName).ToUpper().IndexOf(text.ToUpper()) >= 0)
            {
                treeViewModels.Add(item);
            }
            if (item.Nodes.Count > 0)
            {
                foreach (var node in item.Nodes)
                {
                    OperateTree(node, treeViewModels, text);
                }
            }
        }


        public string GetPYString(string str)

        {

            string tempStr = "";

            foreach (char c in str)

            {

                if ((int)c >= 33 && (int)c <= 126)

                {//字母和符号原样保留

                    tempStr += c.ToString();

                }

                else

                {//累加拼音声母

                    tempStr += GetPYChar(c.ToString());

                }

            }

            return tempStr;

        }

        ///<summary>

        /// 取单个字符的拼音声母

        /// Code By 

        /// 2004-11-30

        ///</summary>

        ///<param name="c">要转换的单个汉字</param>

        ///<returns>拼音声母</returns>

        public string GetPYChar(string c)

        {

            byte[] array = new byte[2];

            array = System.Text.Encoding.Default.GetBytes(c);

            int i = (short)(array[0] - '\0') * 256 + ((short)(array[1] - '\0'));

            if (i < 0xB0A1) return "*";

            if (i < 0xB0C5) return "a";

            if (i < 0xB2C1) return "b";

            if (i < 0xB4EE) return "c";

            if (i < 0xB6EA) return "d";

            if (i < 0xB7A2) return "e";

            if (i < 0xB8C1) return "f";

            if (i < 0xB9FE) return "g";

            if (i < 0xBBF7) return "h";

            if (i < 0xBFA6) return "g";

            if (i < 0xC0AC) return "k";

            if (i < 0xC2E8) return "l";

            if (i < 0xC4C3) return "m";

            if (i < 0xC5B6) return "n";

            if (i < 0xC5BE) return "o";

            if (i < 0xC6DA) return "p";

            if (i < 0xC8BB) return "q";

            if (i < 0xC8F6) return "r";

            if (i < 0xCBFA) return "s";

            if (i < 0xCDDA) return "t";

            if (i < 0xCEF4) return "w";

            if (i < 0xD1B9) return "x";

            if (i < 0xD4D1) return "y";

            if (i < 0xD7FA) return "z";

            return "*";

        }

        private void PopupTest_MouseLeave(object sender, MouseEventArgs e)
        {
            if (!PopupTest.IsFocused)
            {
                PopupTest.IsOpen = false;
            }

        }

        private void header_MouseLeave(object sender, MouseEventArgs e)
        {

            PopupTest.IsOpen = false;

        }

        private void PopupTest_MouseEnter(object sender, MouseEventArgs e)
        {
            PopupTest.IsOpen = true;
        }
    }
}

 

public class TreeViewModel
    {
        public List<TreeViewModel> Nodes { get; set; }
        public TreeViewModel()
        {
            this.Nodes = new List<TreeViewModel>();
            this.parentCode = "000000";                              //主节点的父id默认为0
        }
        public string parentCode { get; set; }//id
        public string code { get; set; }
        public string uuid { get; set; }//id
        public string deptName { get; set; }//部门名称
        public string abbreviation { get; set; }//别名

    }

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值