group 和 line 优化

This commit is contained in:
kwai
2023-02-10 18:49:02 +08:00
parent 18b6bd7e71
commit cf1bfc7482
7 changed files with 65 additions and 39 deletions

View File

@@ -35,7 +35,10 @@
<Canvas x:Name="rootCanvas"> <Canvas x:Name="rootCanvas">
<Path x:Name="line" StrokeThickness="{Binding ColorViewModel.LineWidth}" <Path x:Name="line" StrokeThickness="{Binding ColorViewModel.LineWidth}"
StrokeDashArray="{Binding ColorViewModel.LineDashStyle,Converter={StaticResource LineDashConverter}}" StrokeDashArray="{Binding ColorViewModel.LineDashStyle,Converter={StaticResource LineDashConverter}}"
Style="{StaticResource LineStyle}"> Style="{StaticResource LineStyle}"
StrokeLineJoin="Round"
StrokeStartLineCap="Round"
StrokeEndLineCap="Round">
<Path.Data> <Path.Data>
<MultiBinding Converter="{x:Static s:ConnectionPathConverter.Instance}"> <MultiBinding Converter="{x:Static s:ConnectionPathConverter.Instance}">
<Binding Path="PathGeneratorResult"/> <Binding Path="PathGeneratorResult"/>

View File

@@ -161,11 +161,7 @@ namespace AIStudio.Wpf.DiagramDesigner
return _selectedItem; return _selectedItem;
} }
set set
{ {
if (_selectedItem != null)
{
_selectedItem.PropertyChanged -= ViewModel_PropertyChanged;
}
if (SetProperty(ref _selectedItem, value)) if (SetProperty(ref _selectedItem, value))
{ {
if (_selectedItem == null) if (_selectedItem == null)
@@ -183,10 +179,6 @@ namespace AIStudio.Wpf.DiagramDesigner
LockObjectViewModel = _selectedItem.LockObjectViewModel; LockObjectViewModel = _selectedItem.LockObjectViewModel;
} }
} }
if (_selectedItem != null)
{
_selectedItem.PropertyChanged += ViewModel_PropertyChanged;
}
} }
} }
} }

View File

@@ -183,6 +183,11 @@ namespace AIStudio.Wpf.DiagramDesigner
set set
{ {
if (value <= 0) return; if (value <= 0) return;
if (this is GroupDesignerItemViewModel && value < 70)
{
}
SetProperty(ref _itemWidth, value); SetProperty(ref _itemWidth, value);
} }
} }

View File

@@ -86,7 +86,7 @@ namespace AIStudio.Wpf.DiagramDesigner
public Func<KeyEventArgs, bool> Group public Func<KeyEventArgs, bool> Group
{ {
get; set; get; set;
} = e => e.KeyboardDevice.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.G; } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.G;
} }
} }

View File

@@ -778,7 +778,7 @@ namespace AIStudio.Wpf.DiagramDesigner
private void Add(SelectableDesignerItemViewModelBase item) private void Add(SelectableDesignerItemViewModelBase item)
{ {
item.Root = this; item.Root = this;
item.ZIndex = Items.Count; item.ZIndex = Items.Any() ? Items.Max(p => p.ZIndex) + 1 : 0;
if (item.Id == Guid.Empty) if (item.Id == Guid.Empty)
{ {
item.Id = Guid.NewGuid(); item.Id = Guid.NewGuid();
@@ -1690,24 +1690,20 @@ namespace AIStudio.Wpf.DiagramDesigner
return; return;
} }
RectangleBase rect = GetBoundingRectangle(items); RectangleBase rect = DiagramViewModelHelper.GetBoundingRectangle(items);
if (groupItem == null) if (groupItem == null)
{ {
groupItem = new GroupDesignerItemViewModel(); groupItem = new GroupDesignerItemViewModel();
} }
groupItem.IsGroup = true;
groupItem.ItemWidth = rect.Width;
groupItem.ItemHeight = rect.Height;
groupItem.Left = rect.Left;
groupItem.Top = rect.Top;
groupItem.ZIndex = Items.Count;
DirectAddItemCommand.Execute(groupItem); DirectAddItemCommand.Execute(groupItem);
foreach (DesignerItemViewModelBase item in items) foreach (DesignerItemViewModelBase item in items)
item.ParentId = groupItem.Id; item.ParentId = groupItem.Id;
groupItem.Resize();
ClearSelectedItemsCommand.Execute(null); ClearSelectedItemsCommand.Execute(null);
//groupItem.IsSelected = true; //groupItem.IsSelected = true;
SelectionService.AddToSelection(groupItem); SelectionService.AddToSelection(groupItem);
@@ -1826,25 +1822,6 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
public RectangleBase GetBoundingRectangle(IEnumerable<DesignerItemViewModelBase> items)
{
double x1 = Double.MaxValue;
double y1 = Double.MaxValue;
double x2 = Double.MinValue;
double y2 = Double.MinValue;
foreach (DesignerItemViewModelBase item in items)
{
x1 = Math.Min(item.Left, x1);
y1 = Math.Min(item.Top, y1);
x2 = Math.Max(item.Left + item.ItemWidth, x2);
y2 = Math.Max(item.Top + item.ItemHeight, y2);
}
return new RectangleBase(new PointBase(x1, y1), new PointBase(x2, y2));
}
#region wpf大小与物理像素之间转换 #region wpf大小与物理像素之间转换
public void SetScreenScale() public void SetScreenScale()
{ {

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using AIStudio.Wpf.DiagramDesigner.Geometrys;
namespace AIStudio.Wpf.DiagramDesigner namespace AIStudio.Wpf.DiagramDesigner
{ {
@@ -12,5 +13,24 @@ namespace AIStudio.Wpf.DiagramDesigner
DesignerItemViewModelBase dataItem = items.OfType<DesignerItemViewModelBase>().Single(x => x.Id == conectorDataItemId); DesignerItemViewModelBase dataItem = items.OfType<DesignerItemViewModelBase>().Single(x => x.Id == conectorDataItemId);
return dataItem; return dataItem;
} }
public static RectangleBase GetBoundingRectangle(IEnumerable<DesignerItemViewModelBase> items)
{
double x1 = Double.MaxValue;
double y1 = Double.MaxValue;
double x2 = Double.MinValue;
double y2 = Double.MinValue;
foreach (DesignerItemViewModelBase item in items)
{
x1 = Math.Min(item.Left, x1);
y1 = Math.Min(item.Top, y1);
x2 = Math.Max(item.Left + item.ItemWidth, x2);
y2 = Math.Max(item.Top + item.ItemHeight, y2);
}
return new RectangleBase(new PointBase(x1, y1), new PointBase(x2, y2));
}
} }
} }

View File

@@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Controls;
using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramDesigner;
using AIStudio.Wpf.DiagramDesigner.Geometrys;
using AIStudio.Wpf.DiagramDesigner.Models; using AIStudio.Wpf.DiagramDesigner.Models;
namespace AIStudio.Wpf.DiagramDesigner namespace AIStudio.Wpf.DiagramDesigner
@@ -12,7 +14,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
public GroupDesignerItemViewModel() : this(null) public GroupDesignerItemViewModel() : this(null)
{ {
} }
public GroupDesignerItemViewModel(IDiagramViewModel root) : base(root) public GroupDesignerItemViewModel(IDiagramViewModel root) : base(root)
@@ -34,6 +36,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
base.Init(root); base.Init(root);
this.IsGroup = true;
this.IsHitTestVisible = true; this.IsHitTestVisible = true;
} }
@@ -46,6 +49,32 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
} }
public void Resize()
{
if (this.Root == null) return;
var items = this.Root.Items.Where(p => p.ParentId == Id).OfType<DesignerItemViewModelBase>();
RectangleBase rect = DiagramViewModelHelper.GetBoundingRectangle(items);
this.ItemWidth = rect.Width;
this.ItemHeight = rect.Height;
this.Left = rect.Left;
this.Top = rect.Top;
}
public void AddItem(DesignerItemViewModelBase item)
{
if (this.Root == null) return;
item.ParentId = Id;
if (item.ZIndex > this.ZIndex)
{
var zindex = item.ZIndex;
item.ZIndex = this.ZIndex;
this.ZIndex = zindex;
}
Resize();
}
/// <summary> /// <summary>
/// 打标记使用 /// 打标记使用