Browse Source

遗漏外侧圆的问题

refactor/namespace-and-layering
root 1 month ago
parent
commit
e5864c96b9
  1. 2
      AuroraDesk.Core/Entities/ConnectionPoint.cs
  2. 4
      AuroraDesk.Core/Entities/Node.cs
  3. 4
      AuroraDesk.Core/Entities/NodeTemplate.cs
  4. 1
      AuroraDesk.Presentation/AuroraDesk.Presentation.csproj
  5. 45
      AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs
  6. 34
      AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs
  7. 12
      AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs
  8. 520
      AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml
  9. 141
      modify.md

2
AuroraDesk.Core/Entities/ConnectionPoint.cs

@ -17,7 +17,7 @@ public class ConnectionPoint : ReactiveObject
private bool _isConnected;
private double _diameter = 10;
private string _color = "#3498DB";
private ConnectorPlacementMode _placement = ConnectorPlacementMode.Inside;
private ConnectorPlacementMode _placement = ConnectorPlacementMode.Outside;
/// <summary>
/// 连接点唯一标识符

4
AuroraDesk.Core/Entities/Node.cs

@ -28,8 +28,8 @@ public class Node : ReactiveObject
private double _rightConnectorSize = 10;
private string _leftConnectorColor = "#3498DB";
private string _rightConnectorColor = "#FF6B6B";
private ConnectorPlacementMode _leftConnectorPlacement = ConnectorPlacementMode.Inside;
private ConnectorPlacementMode _rightConnectorPlacement = ConnectorPlacementMode.Inside;
private ConnectorPlacementMode _leftConnectorPlacement = ConnectorPlacementMode.Outside;
private ConnectorPlacementMode _rightConnectorPlacement = ConnectorPlacementMode.Outside;
/// <summary>
/// 构造函数

4
AuroraDesk.Core/Entities/NodeTemplate.cs

@ -18,8 +18,8 @@ public class NodeTemplate : ReactiveObject
private double _height = 80;
private double _leftConnectorSize = 10;
private double _rightConnectorSize = 10;
private ConnectorPlacementMode _leftConnectorPlacement = ConnectorPlacementMode.Inside;
private ConnectorPlacementMode _rightConnectorPlacement = ConnectorPlacementMode.Inside;
private ConnectorPlacementMode _leftConnectorPlacement = ConnectorPlacementMode.Outside;
private ConnectorPlacementMode _rightConnectorPlacement = ConnectorPlacementMode.Outside;
private string _leftConnectorColor = "#3498DB";
private string _rightConnectorColor = "#FF6B6B";

1
AuroraDesk.Presentation/AuroraDesk.Presentation.csproj

@ -8,6 +8,7 @@
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.8" />
<PackageReference Include="Avalonia.Controls.ColorPicker" Version="11.3.8" />
<PackageReference Include="ReactiveUI.Avalonia" Version="11.3.8" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.8" />
<PackageReference Include="DialogHost.Avalonia" Version="0.9.3" />

45
AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs

@ -9,6 +9,15 @@ namespace AuroraDesk.Presentation.Controls;
/// </summary>
public class ConnectorColumnPanel : Panel
{
public static readonly StyledProperty<ConnectorColumnSide> SideProperty =
AvaloniaProperty.Register<ConnectorColumnPanel, ConnectorColumnSide>(nameof(Side), ConnectorColumnSide.Center);
public ConnectorColumnSide Side
{
get => GetValue(SideProperty);
set => SetValue(SideProperty, value);
}
protected override Size MeasureOverride(Size availableSize)
{
var maxWidth = 0d;
@ -18,8 +27,13 @@ public class ConnectorColumnPanel : Panel
{
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
var desired = child.DesiredSize;
maxWidth = Math.Max(maxWidth, desired.Width);
totalHeight += desired.Height;
var margin = (child as Control)?.Margin ?? new Thickness(0);
var horizontalMargin = Math.Abs(margin.Left) + Math.Abs(margin.Right);
var verticalMargin = Math.Max(0, margin.Top) + Math.Max(0, margin.Bottom);
maxWidth = Math.Max(maxWidth, desired.Width + horizontalMargin);
totalHeight += desired.Height + verticalMargin;
}
var height = double.IsInfinity(availableSize.Height) ? totalHeight : availableSize.Height;
@ -37,7 +51,8 @@ public class ConnectorColumnPanel : Panel
var totalHeight = 0d;
foreach (var child in Children)
{
totalHeight += child.DesiredSize.Height;
var margin = (child as Control)?.Margin ?? new Thickness(0);
totalHeight += child.DesiredSize.Height + Math.Max(0, margin.Top) + Math.Max(0, margin.Bottom);
}
var availableHeight = finalSize.Height;
@ -49,13 +64,29 @@ public class ConnectorColumnPanel : Panel
foreach (var child in Children)
{
var childHeight = child.DesiredSize.Height;
var childWidth = Math.Min(child.DesiredSize.Width, finalSize.Width);
var x = (finalSize.Width - childWidth) / 2;
child.Arrange(new Rect(x, currentY, childWidth, childHeight));
currentY += childHeight + spacing;
var childWidth = child.DesiredSize.Width;
var margin = (child as Control)?.Margin ?? new Thickness(0);
double x = Side switch
{
ConnectorColumnSide.Left => margin.Left,
ConnectorColumnSide.Right => finalSize.Width - childWidth - margin.Right,
_ => (finalSize.Width - childWidth) / 2 + (margin.Left - margin.Right) / 2
};
var y = currentY + Math.Max(0, margin.Top);
child.Arrange(new Rect(x, y, childWidth, childHeight));
currentY += Math.Max(0, margin.Top) + childHeight + Math.Max(0, margin.Bottom) + spacing;
}
return finalSize;
}
}
public enum ConnectorColumnSide
{
Center,
Left,
Right
}

34
AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs

@ -21,6 +21,7 @@ public static class NodeCanvasConverters
public static readonly IValueConverter IsNullConverter = new IsNullConverter();
public static readonly IValueConverter DoubleToStringConverter = new DoubleToStringConverter();
public static readonly IValueConverter ColorHexToBrushConverter = new ColorHexToBrushConverter();
public static readonly IValueConverter ColorHexToColorConverter = new ColorHexToColorConverter();
public static readonly IValueConverter ConnectorAttachmentModeToTextConverter = new ConnectorAttachmentModeToTextConverter();
public static readonly IValueConverter ConnectionPointsToInputsConverter = new ConnectionPointsToInputsConverter();
public static readonly IValueConverter ConnectionPointsToOutputsConverter = new ConnectionPointsToOutputsConverter();
@ -318,6 +319,39 @@ public class ColorHexToBrushConverter : IValueConverter
}
}
/// <summary>
/// 将 Hex 字符串与 Avalonia.Media.Color 互转
/// </summary>
public class ColorHexToColorConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value is string hex && !string.IsNullOrWhiteSpace(hex))
{
try
{
return Color.Parse(hex);
}
catch
{
// ignore parse error
}
}
return Colors.Transparent;
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value is Color color)
{
return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
}
return AvaloniaProperty.UnsetValue;
}
}
/// <summary>
/// 将零基索引转换为显示文本(圆 1、圆 2 ...)
/// </summary>

12
AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs

@ -315,8 +315,8 @@ public class NodeCanvasPageViewModel : RoutableViewModel
RightConnectorSize = DefaultConnectorSize,
LeftConnectorColor = "#2D9CDB",
RightConnectorColor = "#EB5757",
LeftConnectorPlacement = ConnectorPlacementMode.Inside,
RightConnectorPlacement = ConnectorPlacementMode.Inside
LeftConnectorPlacement = ConnectorPlacementMode.Outside,
RightConnectorPlacement = ConnectorPlacementMode.Outside
});
NodeTemplates.Add(new NodeTemplate
@ -333,8 +333,8 @@ public class NodeCanvasPageViewModel : RoutableViewModel
RightConnectorSize = DefaultConnectorSize,
LeftConnectorColor = "#2D9CDB",
RightConnectorColor = "#EB5757",
LeftConnectorPlacement = ConnectorPlacementMode.Inside,
RightConnectorPlacement = ConnectorPlacementMode.Inside
LeftConnectorPlacement = ConnectorPlacementMode.Outside,
RightConnectorPlacement = ConnectorPlacementMode.Outside
});
}
@ -359,8 +359,8 @@ public class NodeCanvasPageViewModel : RoutableViewModel
RightConnectorSize = DefaultConnectorSize,
LeftConnectorColor = "#2D9CDB",
RightConnectorColor = "#EB5757",
LeftConnectorPlacement = ConnectorPlacementMode.Inside,
RightConnectorPlacement = ConnectorPlacementMode.Inside
LeftConnectorPlacement = ConnectorPlacementMode.Outside,
RightConnectorPlacement = ConnectorPlacementMode.Outside
};
// 默认提供输入和输出连接点

520
AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml

@ -5,9 +5,10 @@
xmlns:vm="using:AuroraDesk.Presentation.ViewModels.Pages"
xmlns:reactive="using:ReactiveUI.Avalonia"
xmlns:entities="using:AuroraDesk.Core.Entities"
xmlns:converters="using:AuroraDesk.Presentation.Converters"
xmlns:heroicons="clr-namespace:HeroIconsAvalonia.Controls;assembly=HeroIconsAvalonia"
xmlns:converters="using:AuroraDesk.Presentation.Converters"
xmlns:heroicons="clr-namespace:HeroIconsAvalonia.Controls;assembly=HeroIconsAvalonia"
xmlns:controls="clr-namespace:AuroraDesk.Presentation.Controls"
xmlns:cp="clr-namespace:Avalonia.Controls;assembly=Avalonia.Controls.ColorPicker"
mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800"
x:Class="AuroraDesk.Presentation.Views.Pages.NodeCanvasPageView"
x:DataType="vm:NodeCanvasPageViewModel"
@ -21,6 +22,7 @@
<converters:IsNullConverter x:Key="IsNullConverter"/>
<converters:DoubleToStringConverter x:Key="DoubleToStringConverter"/>
<converters:ColorHexToBrushConverter x:Key="ColorHexToBrushConverter"/>
<converters:ColorHexToColorConverter x:Key="ColorHexToColorConverter"/>
<converters:ConnectorAttachmentModeToTextConverter x:Key="ConnectorAttachmentModeToTextConverter"/>
<converters:ConnectionPointsToInputsConverter x:Key="ConnectionPointsToInputsConverter"/>
<converters:ConnectionPointsToOutputsConverter x:Key="ConnectionPointsToOutputsConverter"/>
@ -338,6 +340,7 @@
BorderBrush="{Binding IsSelected, Converter={StaticResource BooleanToBorderBrushConverter}}"
BorderThickness="{Binding IsSelected, Converter={StaticResource BooleanToBorderThicknessConverter}}"
BoxShadow="0 2 8 0 #00000015"
ClipToBounds="False"
Canvas.Left="{Binding X}"
Canvas.Top="{Binding Y}">
<Grid ColumnDefinitions="Auto,*,Auto"
@ -352,7 +355,8 @@
VerticalAlignment="Center">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<controls:ConnectorColumnPanel VerticalAlignment="Stretch"/>
<controls:ConnectorColumnPanel VerticalAlignment="Stretch"
Side="Left"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
@ -399,7 +403,8 @@
VerticalAlignment="Center">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<controls:ConnectorColumnPanel VerticalAlignment="Stretch"/>
<controls:ConnectorColumnPanel VerticalAlignment="Stretch"
Side="Right"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
@ -477,6 +482,15 @@
<Setter Property="FontFamily" Value="Microsoft YaHei, Segoe UI, Arial"/>
<Setter Property="UseLayoutRounding" Value="True"/>
</Style>
<Style Selector="cp|ColorPicker">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="BorderBrush" Value="{StaticResource BorderLight}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="6"/>
<Setter Property="Background" Value="{StaticResource BackgroundWhite}"/>
<Setter Property="Foreground" Value="{StaticResource TextPrimary}"/>
<Setter Property="MinHeight" Value="32"/>
</Style>
<Style Selector="TextBlock">
<Setter Property="FontFamily" Value="Microsoft YaHei, Segoe UI, Arial"/>
<Setter Property="UseLayoutRounding" Value="True"/>
@ -496,41 +510,67 @@
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
<Grid ColumnDefinitions="140,*"
RowDefinitions="Auto,Auto,Auto"
UseLayoutRounding="True">
<TextBlock Grid.Row="0"
Text="名称"
Margin="0,0,12,6"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Grid.Row="0"
Grid.Column="1"
Text="{Binding SelectedNode.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Watermark="请输入名称"/>
<Border BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="4">
<Grid ColumnDefinitions="110,*"
RowDefinitions="Auto,Auto,Auto"
UseLayoutRounding="True">
<Border Grid.Row="0"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="名称"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="0"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<TextBox Text="{Binding SelectedNode.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Watermark="请输入名称"/>
</Border>
<TextBlock Grid.Row="1"
Text="宽度"
Margin="0,8,12,6"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Grid.Row="1"
Grid.Column="1"
Margin="0,8,0,0"
Text="{Binding SelectedNode.Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
<Border Grid.Row="1"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="宽度"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="1"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<TextBox Text="{Binding SelectedNode.Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</Border>
<TextBlock Grid.Row="2"
Text="高度"
Margin="0,8,12,0"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Grid.Row="2"
Grid.Column="1"
Margin="0,8,0,0"
Text="{Binding SelectedNode.Height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</Grid>
<Border Grid.Row="2"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,0"
Padding="10,8">
<TextBlock Text="高度"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="2"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,0"
Padding="10,4">
<TextBox Text="{Binding SelectedNode.Height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</Border>
</Grid>
</Border>
</StackPanel>
</Border>
@ -545,188 +585,280 @@
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
<StackPanel Spacing="12">
<StackPanel Spacing="4">
<TextBlock Text="显示位置"
<Border BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="4">
<Grid ColumnDefinitions="110,*"
RowDefinitions="Auto,Auto">
<Border Grid.Row="0"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="左侧数量"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<ComboBox SelectedItem="{Binding SelectedConnectorMode, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource ConnectorAttachmentModeToTextConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<entities:ConnectorAttachmentMode>None</entities:ConnectorAttachmentMode>
<entities:ConnectorAttachmentMode>LeftOnly</entities:ConnectorAttachmentMode>
<entities:ConnectorAttachmentMode>RightOnly</entities:ConnectorAttachmentMode>
<entities:ConnectorAttachmentMode>Both</entities:ConnectorAttachmentMode>
</ComboBox.Items>
</ComboBox>
</StackPanel>
</Border>
<Border Grid.Row="0"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<ComboBox ItemsSource="{Binding ConnectorCountOptions}"
SelectedItem="{Binding SelectedLeftConnectorCount, Mode=TwoWay}"/>
</Border>
<StackPanel Orientation="Horizontal" Spacing="12">
<StackPanel Width="140" Spacing="4">
<TextBlock Text="左侧数量"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<ComboBox ItemsSource="{Binding ConnectorCountOptions}"
SelectedItem="{Binding SelectedLeftConnectorCount, Mode=TwoWay}"/>
</StackPanel>
<StackPanel Width="140" Spacing="4">
<TextBlock Text="右侧数量"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<ComboBox ItemsSource="{Binding ConnectorCountOptions}"
SelectedItem="{Binding SelectedRightConnectorCount, Mode=TwoWay}"/>
</StackPanel>
</StackPanel>
</StackPanel>
<Border Grid.Row="1"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,0"
Padding="10,8">
<TextBlock Text="右侧数量"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="1"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,0"
Padding="10,4">
<ComboBox ItemsSource="{Binding ConnectorCountOptions}"
SelectedItem="{Binding SelectedRightConnectorCount, Mode=TwoWay}"/>
</Border>
</Grid>
</Border>
<Grid ColumnDefinitions="*,*"
ColumnSpacing="16">
<StackPanel Grid.Column="0" Spacing="10">
<StackPanel Spacing="16">
<Expander HorizontalAlignment="Stretch"
IsExpanded="True"
Padding="0">
<Expander.Header>
<TextBlock Text="左侧圆"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
</Expander.Header>
<Border Background="{StaticResource BackgroundLight}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
Padding="10">
<StackPanel Spacing="10">
<TextBlock Text="左侧圆"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
<ItemsControl ItemsSource="{Binding SelectedNode.ConnectionPoints, Converter={StaticResource ConnectionPointsToInputsConverter}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="10"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource BackgroundWhite}"
Padding="6">
<ItemsControl ItemsSource="{Binding SelectedNode.ConnectionPoints, Converter={StaticResource ConnectionPointsToInputsConverter}}"
HorizontalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"
Spacing="0"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource BackgroundWhite}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
HorizontalAlignment="Stretch">
<Grid ColumnDefinitions="110,*"
RowDefinitions="Auto,Auto,Auto,Auto">
<Border Grid.Row="0"
Grid.ColumnSpan="2"
Background="{StaticResource BackgroundLight}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
Padding="10">
<StackPanel Spacing="10">
<TextBlock Text="{Binding Index, Converter={StaticResource IndexToDisplayTextConverter}}"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
BorderThickness="0,0,0,1"
Padding="12,6">
<TextBlock Text="{Binding Index, Converter={StaticResource IndexToDisplayTextConverter}}"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="直径"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Text="{Binding Diameter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</StackPanel>
<Border Grid.Row="1"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="直径"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="1"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<TextBox Text="{Binding Diameter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="颜色"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Text="{Binding Color, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Watermark="#RRGGBB"/>
</StackPanel>
<Border Grid.Row="2"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="颜色"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="2"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<cp:ColorPicker Color="{Binding Color, Mode=TwoWay, Converter={StaticResource ColorHexToColorConverter}}"
IsAlphaEnabled="False"
IsColorPreviewVisible="True"
IsColorPaletteVisible="True"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="定位"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<ComboBox SelectedItem="{Binding Placement, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource ConnectorPlacementToTextConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<entities:ConnectorPlacementMode>Inside</entities:ConnectorPlacementMode>
<entities:ConnectorPlacementMode>Outside</entities:ConnectorPlacementMode>
</ComboBox.Items>
</ComboBox>
</StackPanel>
</StackPanel>
<Border Grid.Row="3"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,0"
Padding="10,8">
<TextBlock Text="定位"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<Border Grid.Row="3"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,0"
Padding="10,4">
<ComboBox SelectedItem="{Binding Placement, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource ConnectorPlacementToTextConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<entities:ConnectorPlacementMode>Inside</entities:ConnectorPlacementMode>
<entities:ConnectorPlacementMode>Outside</entities:ConnectorPlacementMode>
</ComboBox.Items>
</ComboBox>
</Border>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</StackPanel>
</Expander>
<StackPanel Grid.Column="1" Spacing="10">
<Expander HorizontalAlignment="Stretch"
IsExpanded="True"
Padding="0">
<Expander.Header>
<TextBlock Text="右侧圆"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
</Expander.Header>
<Border Background="{StaticResource BackgroundLight}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
Padding="10">
<StackPanel Spacing="10">
<TextBlock Text="右侧圆"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
<ItemsControl ItemsSource="{Binding SelectedNode.ConnectionPoints, Converter={StaticResource ConnectionPointsToOutputsConverter}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="10"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource BackgroundWhite}"
Padding="6">
<ItemsControl ItemsSource="{Binding SelectedNode.ConnectionPoints, Converter={StaticResource ConnectionPointsToOutputsConverter}}"
HorizontalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"
Spacing="0"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource BackgroundWhite}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
HorizontalAlignment="Stretch">
<Grid ColumnDefinitions="110,*"
RowDefinitions="Auto,Auto,Auto,Auto">
<Border Grid.Row="0"
Grid.ColumnSpan="2"
Background="{StaticResource BackgroundLight}"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1"
CornerRadius="6"
Padding="10">
<StackPanel Spacing="10">
<TextBlock Text="{Binding Index, Converter={StaticResource IndexToDisplayTextConverter}}"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
BorderThickness="0,0,0,1"
Padding="12,6">
<TextBlock Text="{Binding Index, Converter={StaticResource IndexToDisplayTextConverter}}"
FontSize="12"
FontWeight="SemiBold"
Foreground="{StaticResource TextPrimary}"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="直径"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Text="{Binding Diameter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</StackPanel>
<Border Grid.Row="1"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="直径"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="1"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<TextBox Text="{Binding Diameter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}}"
Watermark="0"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="颜色"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<TextBox Text="{Binding Color, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Watermark="#RRGGBB"/>
</StackPanel>
<Border Grid.Row="2"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,1"
Padding="10,8">
<TextBlock Text="颜色"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
<Border Grid.Row="2"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,1"
Padding="10,4">
<cp:ColorPicker Color="{Binding Color, Mode=TwoWay, Converter={StaticResource ColorHexToColorConverter}}"
IsAlphaEnabled="False"
IsColorPreviewVisible="True"
IsColorPaletteVisible="True"/>
</Border>
<StackPanel Spacing="4">
<TextBlock Text="定位"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
<ComboBox SelectedItem="{Binding Placement, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource ConnectorPlacementToTextConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<entities:ConnectorPlacementMode>Inside</entities:ConnectorPlacementMode>
<entities:ConnectorPlacementMode>Outside</entities:ConnectorPlacementMode>
</ComboBox.Items>
</ComboBox>
</StackPanel>
</StackPanel>
<Border Grid.Row="3"
Grid.Column="0"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="0,0,1,0"
Padding="10,8">
<TextBlock Text="定位"
FontSize="12"
Foreground="{StaticResource TextSecondary}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<Border Grid.Row="3"
Grid.Column="1"
BorderBrush="{StaticResource BorderLight}"
BorderThickness="1,0,0,0"
Padding="10,4">
<ComboBox SelectedItem="{Binding Placement, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource ConnectorPlacementToTextConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<entities:ConnectorPlacementMode>Inside</entities:ConnectorPlacementMode>
<entities:ConnectorPlacementMode>Outside</entities:ConnectorPlacementMode>
</ComboBox.Items>
</ComboBox>
</Border>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</StackPanel>
</Grid>
</Expander>
</StackPanel>
</StackPanel>
</Border>
</StackPanel>

141
modify.md

@ -14,6 +14,147 @@
- `AuroraDesk.Core/Entities/Node.cs`
- **效果**: 调整左右附件圆数量后,画布节点立即刷新圆点数量,属性面板与画布保持一致。
### 调整左右附件圆属性布局为纵向卡片
- **日期**: 2025年11月6日
- **调整内容**:
1. 将左、右侧圆属性卡片改为纵向排列,避免同列并排导致内容拥挤。
2. 每个圆的属性表单重构为与“组件属性”一致的双列表格布局,字段包含序号、直径、颜色、定位。
3. 精简卡片内边距与边框样式,统一视觉层级与留白。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 左右附件圆配置区域上下排列,阅读顺序更自然。
- ✅ 单个圆属性表单与基础属性风格一致,输入焦点和字段对齐更整洁。
### 为左右附件圆卡片添加折叠交互
- **日期**: 2025年11月6日
- **修改内容**:
1. 使用 `Expander` 包裹左、右侧圆配置区域,提供可折叠的标题栏。
2. 保留原有卡片边框与间距,使内容在展开时维持一致的视觉风格。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 用户可根据需要折叠左右圆配置,保持属性面板简洁。
- ✅ 展开后内容布局与原先保持一致,无额外视觉跳变。
### 精简附件圆卡片内边距与行距
- **日期**: 2025年11月6日
- **调整内容**:
1. 将左右圆 `Expander` 的内容区 Padding 调整为 6,并取消区块间额外间距。
2. 附件圆列表使用 `StackPanel Spacing="0"`,紧凑呈现多个圆的属性表格。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 属性面板整体占用更少垂直空间,避免上下留白。
- ✅ 多个圆的配置无额外间距,信息密度更高。
### 将显示位置与数量配置改为表格布局
- **日期**: 2025年11月6日
- **调整内容**:
1. 用带边框的双列表格承载“显示位置”“左侧数量”“右侧数量”三项配置。
2. 统一标签与输入控件的对齐方式,与其他属性表格保持视觉一致。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 显示位置与数量编辑区域风格与其他属性卡片一致。
- ✅ 输入控件列宽固定,阅读与操作更清晰。
### 移除显示位置选项
- **日期**: 2025年11月6日
- **调整内容**:
1. 删除“显示位置”下拉框,仅保留左右数量配置,由数量是否为零决定显示侧。
2. 表格结构调整为两行(左/右数量),边框与间距同步更新。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 属性面板更精简,避免重复配置。
- ✅ 左右数量保持原有样式,操作习惯不变。
### 默认附件圆定位改为外侧,并修正偏移
- **日期**: 2025年11月6日
- **修改内容**:
1. 将 `Node`、`NodeTemplate`、`ConnectionPoint` 的默认 `ConnectorPlacementMode` 调整为 `Outside`,并同步更新模板/新增节点逻辑。
2. `ConnectorPlacementMarginConverter` 外侧偏移量调整为直径长度,确保圆点完全位于节点外。
3. `ConnectorColumnPanel` 新增 `Side` 属性,支持根据左右方向贴边排列,并在节点模板中分别指定 `Side="Left"/"Right"`
- **涉及文件**:
- `AuroraDesk.Core/Entities/Node.cs`
- `AuroraDesk.Core/Entities/NodeTemplate.cs`
- `AuroraDesk.Core/Entities/ConnectionPoint.cs`
- `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs`
- `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs`
- `AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs`
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 新增节点与模板默认渲染为外侧圆点,减少手动修改。
- ✅ 选择“外侧”后圆点完全贴在节点外部,视觉符合预期。
### 附件圆颜色编辑改用 ColorPicker
- **日期**: 2025年11月6日
- **修改内容**:
1. 引入 `av:ColorPicker` 替换原有颜色文本框,支持直接选色,禁用 Alpha 频道。
2. 新增 `ColorHexToColorConverter` 实现十六进制字符串与 `Color` 互转,配合 `ColorPicker` 双向绑定。
3. 为 `ColorPicker` 提供统一样式(圆角、边框、高度),保持与其他输入控件一致的视觉风格。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs`
- **效果**:
- ✅ 颜色编辑更直观,避免手动输入 Hex。
- ✅ 色值仍以 `#RRGGBB` 字符串形式写回实体,兼容现有数据结构。
### 修正 ColorPicker 属性名以适配新版控件
- **日期**: 2025年11月6日
- **修改内容**:
1. 将 `ShowPreview`、`PaletteVisible` 替换为 Avalonia 11 新增的 `IsColorPreviewVisible`、`IsColorPaletteVisible` 属性。
2. 保留 `IsAlphaEnabled="False"` 设置,持续禁用 Alpha 通道输入。
3. 重新启用颜色预览与调色板,便于观察和选择颜色。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 解决构建时 AVLN2000 属性解析错误,ColorPicker 正常渲染。
- ✅ 色彩预览与调色板恢复显示,调整颜色更直观。
### 确保外侧连接点可见
- **日期**: 2025年11月6日
- **修改内容**:
1. 为节点模板中的根 `Border` 设置 `ClipToBounds="False"`,允许连接点超出节点边界时仍然渲染。
2. 保持现有圆角与阴影效果不变。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 选择“外侧”定位后,左右连接点完整显示在节点外侧。
### 调整外侧连接点偏移使视觉对齐
- **日期**: 2025年11月6日
- **修改内容**:
1. 将外侧模式下的偏移量由“直径”改为“直径的一半”,使圆点一半在边外、一半在边内。
2. 保持内侧定位逻辑不变。
- **涉及文件**:
- `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs`
- **效果**:
- ✅ 外侧圆点与内侧视觉保持一致,贴边但不会完全漂出。
### 修正 ConnectorColumnPanel 右侧排列的外侧偏移
- **日期**: 2025年11月6日
- **修改内容**:
1. 调整 `ConnectorColumnPanel``Right` 分支的排布公式,允许负 `Margin.Right` 将圆点推到节点外侧。
2. 维持正向 margin 的内缩行为不变。
- **涉及文件**:
- `AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs`
- **效果**:
- ✅ 右侧外侧圆点将按照设置偏移正确露出外部,视觉与左侧一致。
### 优化特性面板表格与附件圆横向编辑体验
- **日期**: 2025年11月6日
- **调整内容**:
1. 组件基础属性改为表格式布局,使用带边框的双列表格展示名称、宽度、高度,列宽收紧至 110,信息更集中。
2. 左右附件圆编辑面板改为卡片顶部标题+横向三列(直径/颜色/定位)布局,字段一行内即可填写。
3. 附件圆列表改回纵向 `StackPanel`,每个圆独占一行,卡片随列宽拉伸;保留单卡片分栏布局并统一边距,确保各项独立且排版整洁。
- **涉及文件**:
- `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml`
- **效果**:
- ✅ 特性信息以带边框表格呈现,阅读更清晰。
- ✅ 左右附件圆参数可横向填写,减少垂直空间占用。
### 节点附件圆重构:逐个圆配置半径与定位
- **日期**: 2025年11月6日
- **修改内容**:

Loading…
Cancel
Save