思维导图修改成回车新增子节点

This commit is contained in:
艾竹
2023-05-03 23:42:34 +08:00
parent 071490f5ee
commit 940512589c
11 changed files with 153 additions and 27 deletions

View File

@@ -399,8 +399,8 @@ namespace AIStudio.Wpf.DiagramDesigner
protected override void OnMouseMove(MouseEventArgs e)
{
//var focusedElement = Keyboard.FocusedElement;
//Debug.WriteLine("focusedElement" + focusedElement?.ToString());
var focusedElement = Keyboard.FocusedElement;
Debug.WriteLine("focusedElement" + focusedElement?.ToString());
base.OnMouseMove(e);

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xaml.Behaviors;
using System.Windows.Input;
using System.Windows.Controls;
namespace AIStudio.Wpf.DiagramDesigner
{
public class TextBoxEnterKeyUpdateBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
if (this.AssociatedObject != null)
{
base.OnAttached();
this.AssociatedObject.KeyDown += AssociatedObject_KeyDown;
}
}
protected override void OnDetaching()
{
if (this.AssociatedObject != null)
{
this.AssociatedObject.KeyDown -= AssociatedObject_KeyDown;
base.OnDetaching();
}
}
private void AssociatedObject_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
TextBox textBox = sender as TextBox;
if (textBox != null)
{
if (e.Key == Key.Return)
{
if (e.Key == Key.Enter)
{
textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
}
}
}
}

View File

@@ -30,7 +30,7 @@
HorizontalContentAlignment="{Binding FontViewModel.HorizontalAlignment}"
VerticalContentAlignment="{Binding FontViewModel.VerticalAlignment}"
TextBlock.LineHeight="{Binding FontViewModel.LineHeight}"
AcceptsReturn="True"
AcceptsReturn="{Binding AcceptsReturn,RelativeSource={RelativeSource AncestorType=dd:TextControl}}"
IsHitTestVisible="False"
dd:ControlAttachProperty.Watermark="{Binding Path=(dd:ControlAttachProperty.Watermark),RelativeSource={RelativeSource AncestorType={x:Type dd:TextControl}}}"
Style="{StaticResource WaterTextBoxWithEffect}" IsReadOnly="True">
@@ -49,7 +49,7 @@
HorizontalContentAlignment="{Binding FontViewModel.HorizontalAlignment}"
VerticalContentAlignment="{Binding FontViewModel.VerticalAlignment}"
TextBlock.LineHeight="{Binding FontViewModel.LineHeight}"
AcceptsReturn="True"
AcceptsReturn="{Binding AcceptsReturn,RelativeSource={RelativeSource AncestorType=dd:TextControl}}"
Focusable="False"
dd:ControlAttachProperty.Watermark="{Binding Path=(dd:ControlAttachProperty.Watermark),RelativeSource={RelativeSource AncestorType={x:Type dd:TextControl}}}"
Style="{StaticResource WaterTextBoxWithEffect}" Visibility="Collapsed">

View File

@@ -18,6 +18,16 @@ namespace AIStudio.Wpf.DiagramDesigner
/// </summary>
public partial class TextControl : UserControl
{
public static readonly DependencyProperty AcceptsReturnProperty = DependencyProperty.Register(
nameof(AcceptsReturn), typeof(bool), typeof(TextControl), new FrameworkPropertyMetadata(
true));
public bool AcceptsReturn
{
get => (bool)GetValue(AcceptsReturnProperty);
set => SetValue(AcceptsReturnProperty, value);
}
public TextControl()
{
InitializeComponent();
@@ -78,9 +88,11 @@ namespace AIStudio.Wpf.DiagramDesigner
BindingExpression binding = PART_ShowText.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
PART_ShowText.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
PART_ShowText.Visibility = Visibility.Collapsed;
PART_TextBlock.Visibility = Visibility.Visible;
PART_TextBlock.Visibility = Visibility.Visible;
selectable.IsEditing = false;
}
}

View File

@@ -150,5 +150,11 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get; set;
} = e => e.KeyboardDevice.Modifiers == ModifierKeys.Alt | e.Key == Key.A;
[Description("Next Node (CEnter by default)")]
public Func<KeyEventArgs, bool> Next
{
get; set;
} = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Enter;
}
}

View File

@@ -14,6 +14,7 @@ using AIStudio.Wpf.DiagramDesigner.Helpers;
using AIStudio.Wpf.DiagramDesigner.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using static System.Net.Mime.MediaTypeNames;
namespace AIStudio.Wpf.DiagramDesigner
{
@@ -735,6 +736,15 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
private ICommand _nextCommand;
public ICommand NextCommand
{
get
{
return this._nextCommand ?? (this._nextCommand = new SimpleCommand(ExecuteEnable, ExecuteNextCommand));
}
}
private ICommand _alignTopCommand;
public ICommand AlignTopCommand
{
@@ -1511,6 +1521,11 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
public virtual void ExecuteNextCommand(object parameter)
{
}
private void ExecuteSelectAllCommand(object parameter)
{
List<SelectableDesignerItemViewModelBase> selectedItems = Items.ToList();
@@ -3146,7 +3161,11 @@ namespace AIStudio.Wpf.DiagramDesigner
ReplaceAllCommand.Execute(new object[] { SearchText, ReplaceText });
return true;
}
else if (DiagramOption.ShortcutOption.Next(e))
{
NextCommand.Execute(null);
return true;
}
return false;
}
#endregion

View File

@@ -44,10 +44,7 @@ namespace AIStudio.Wpf.DiagramDesigner
protected override void Init(IDiagramViewModel root, bool initNew)
{
base.Init(root, initNew);
SelectItemCommand = new SimpleCommand(Command_Enable, ExecuteSelectItemCommand);
EditCommand = new SimpleCommand(Command_Enable, ExecuteEditCommand);
base.Init(root, initNew);
}
protected override void InitNew()
@@ -69,13 +66,31 @@ namespace AIStudio.Wpf.DiagramDesigner
return true;
}
private ICommand _selectItemCommand;
public ICommand SelectItemCommand
{
get; private set;
get
{
return this._editCommand ?? (this._editCommand = new SimpleCommand(Command_Enable, ExecuteSelectItemCommand));
}
}
private ICommand _editCommand;
public ICommand EditCommand
{
get; private set;
get
{
return this._editCommand ?? (this._editCommand = new SimpleCommand(Command_Enable, ExecuteEditCommand));
}
}
private ICommand _exitEditCommand;
public ICommand ExitEditCommand
{
get
{
return this._exitEditCommand ?? (this._exitEditCommand = new SimpleCommand(Command_Enable, ExecuteExitEditCommand));
}
}
private bool enabledForSelection = true;
@@ -162,6 +177,11 @@ namespace AIStudio.Wpf.DiagramDesigner
if (IsReadOnly == true) return;
ShowText = true;
}
}
protected virtual void ExecuteExitEditCommand(object param)
{
IsSelected = false;
}
}
}

View File

@@ -47,6 +47,10 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get;
}
ICommand NextCommand
{
get;
}
ICommand AlignTopCommand
{
get;
@@ -204,7 +208,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get;
}
ICommand ShowSearchCommand
ICommand ShowSearchCommand
{
get;
}
@@ -368,7 +372,7 @@ namespace AIStudio.Wpf.DiagramDesigner
DoCommandManager DoCommandManager
{
get;
get;
}
#region
DiagramOption DiagramOption

View File

@@ -88,7 +88,11 @@
<controls:PriorityControl Grid.Column="1" Priority="{Binding Priority}"
Visibility="{Binding Priority,Converter={StaticResource NullableToVisibilityConverter}}"
IsHitTestVisible="False"/>
<dd:TextControl Grid.Column="2" IsHitTestVisible="{Binding IsEditing}"/>
<dd:TextControl Grid.Column="2" IsHitTestVisible="{Binding IsEditing}" AcceptsReturn="False">
<dd:TextControl.InputBindings>
<KeyBinding Key="Enter" Command="{Binding ExitEditCommand}" />
</dd:TextControl.InputBindings>
</dd:TextControl>
<controls:LinkControl Grid.Column="3"
Visibility="{Binding LinkInfo,Converter={StaticResource NullableToVisibilityConverter}}"
Url="{Binding LinkInfo.Link}"

View File

@@ -456,7 +456,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
RaisePropertyChanged(nameof(MindType));
RaisePropertyChanged(nameof(MindTheme));
}
}
}
}
#endregion
@@ -592,13 +592,19 @@ namespace AIStudio.Wpf.Mind.ViewModels
foreach (var item in items)
{
if (item.ParentNode == null)
continue;
int index = item.ParentNode.Children.IndexOf(item);
var newitem = new MindNode(this) { Text = $"分支主题{item.ParentNode.Children.Count + 1}" };
item.IsSelected = false;
newitem.AddTo(item.ParentNode, index + 1);
newitems.Add(newitem);
{
var newitem = new MindNode(this) { Text = $"分支主题{item.Children.Count + 1}" };
newitem.AddTo(item);
newitems.Add(newitem);
}
else
{
int index = item.ParentNode.Children.IndexOf(item);
var newitem = new MindNode(this) { Text = $"分支主题{item.ParentNode.Children.Count + 1}" };
item.IsSelected = false;
newitem.AddTo(item.ParentNode, index + 1);
newitems.Add(newitem);
}
}
items.Select(p => p.RootNode).Distinct().ToList().ForEach(p => p.UpdatedLayout());
@@ -614,6 +620,11 @@ namespace AIStudio.Wpf.Mind.ViewModels
});
}
public override void ExecuteNextCommand(object parameter)
{
ExecuteAddPearCommand(parameter);
}
private void ExecuteMoveBackCommand(object parameter)
{
List<MindNode> items = new List<MindNode>();
@@ -1083,7 +1094,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
{
roots = MindSelectedItems.Select(p => p.RootNode).Distinct().ToList();
}
if (roots.Count > 0)
{
DoCommandManager.DoNewCommand(this.ToString(),

View File

@@ -746,7 +746,10 @@ namespace AIStudio.Wpf.Mind.ViewModels
IsSelected = selected;
}
protected override void ExecuteExitEditCommand(object param)
{
Root.NextCommand.Execute(this);
}
#endregion
}