102 lines
2.4 KiB
C#
102 lines
2.4 KiB
C#
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));
|
|
}
|
|
}
|