优化更新代码,添加界面功能并整合
This commit is contained in:
101
WPFluent/Controls/TreeModelListView/TreeModelListViewItem.cs
Normal file
101
WPFluent/Controls/TreeModelListView/TreeModelListViewItem.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace WPFluent.Controls;
|
||||
|
||||
public class TreeModelListViewItem : ListViewItem, INotifyPropertyChanged
|
||||
{
|
||||
private TreeModelNode? _node;
|
||||
|
||||
public TreeModelNode? Node
|
||||
{
|
||||
get => _node;
|
||||
internal set
|
||||
{
|
||||
_node = value;
|
||||
OnPropertyChanged(nameof(Node));
|
||||
}
|
||||
}
|
||||
|
||||
public TreeModelListViewItem()
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnKeyDown(KeyEventArgs e)
|
||||
{
|
||||
if (Node != null)
|
||||
{
|
||||
switch (e.Key)
|
||||
{
|
||||
case Key.Right:
|
||||
e.Handled = true;
|
||||
if (!Node.IsExpanded)
|
||||
{
|
||||
Node.IsExpanded = true;
|
||||
ChangeFocus(Node);
|
||||
}
|
||||
else if (Node.Children.Count > 0)
|
||||
{
|
||||
ChangeFocus(Node.Children[0]);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Key.Left:
|
||||
|
||||
e.Handled = true;
|
||||
if (Node.IsExpanded && Node.IsExpandable)
|
||||
{
|
||||
Node.IsExpanded = false;
|
||||
ChangeFocus(Node);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChangeFocus(Node.Parent);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Key.Subtract:
|
||||
e.Handled = true;
|
||||
Node.IsExpanded = false;
|
||||
ChangeFocus(Node);
|
||||
break;
|
||||
|
||||
case Key.Add:
|
||||
e.Handled = true;
|
||||
Node.IsExpanded = true;
|
||||
ChangeFocus(Node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!e.Handled)
|
||||
{
|
||||
base.OnKeyDown(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void ChangeFocus(TreeModelNode? node)
|
||||
{
|
||||
if (node?.Tree is TreeModelListView { } tree)
|
||||
{
|
||||
if (tree.ItemContainerGenerator.ContainerFromItem(node) is TreeModelListViewItem item)
|
||||
{
|
||||
item.Focus();
|
||||
}
|
||||
else
|
||||
{
|
||||
tree.PendingFocusNode = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
|
||||
private void OnPropertyChanged(string name)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user