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