添加画布信息视图

This commit is contained in:
fengjiayi
2025-05-27 23:46:06 +08:00
parent d055add74c
commit f7cae3493f
33 changed files with 532 additions and 155 deletions

View File

@@ -0,0 +1,96 @@
<UserControl x:Class="Serein.Workbench.Views.CanvasInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Serein.Workbench.Views"
xmlns:vm="clr-namespace:Serein.Workbench.ViewModels"
xmlns:converter="clr-namespace:Serein.Workbench.Converters"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="300"
d:DataContext="{d:DesignInstance vm:CanvasInfoViewModel}">
<UserControl.Resources>
<converter:CountToVisibilityConverter x:Key="CountToVisibilityConverter"/>
<Style x:Key="InfoTipsTextBlock" TargetType="TextBlock">
<Setter Property="Width" Value="70"/>
<Setter Property="MinWidth" Value="70"/>
<Setter Property="MaxHeight" Value="70"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="InfoValueTextBox" TargetType="TextBox">
<Setter Property="Width" Value="170"/>
<Setter Property="MinWidth" Value="170"/>
<Setter Property="MaxHeight" Value="170"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Margin="10" >
<TextBlock Text="公开节点" HorizontalAlignment="Left"/>
<ListBox ItemsSource="{Binding Model.PublicNodes}"
Visibility="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource CountToVisibilityConverter}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel Grid.Row="2" Margin="10">
<TextBlock Text="流程节点" HorizontalAlignment="Left"/>
<ListBox ItemsSource="{Binding Model.Nodes}"
Visibility="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource CountToVisibilityConverter}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel Grid.Row="0" Margin="10">
<TextBlock Text="画布信息" HorizontalAlignment="Left"/>
<!--<StackPanel Margin="2" Orientation="Horizontal">
<TextBlock Text="GUID" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.Guid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>-->
<StackPanel Margin="1" Orientation="Horizontal">
<TextBlock Text="画布名称" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>
<StackPanel Margin="1" Orientation="Horizontal">
<TextBlock Text="尺寸宽度" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>
<StackPanel Margin="1" Orientation="Horizontal">
<TextBlock Text="尺寸高度" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.Height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>
<StackPanel Margin="1" Orientation="Horizontal">
<TextBlock Text="预览位置X" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.ViewX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>
<StackPanel Margin="1" Orientation="Horizontal">
<TextBlock Text="预览位置Y" Style="{StaticResource InfoTipsTextBlock}" />
<TextBox Text="{Binding Model.ViewY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource InfoValueTextBox}"/>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>

View File

@@ -0,0 +1,32 @@
using Serein.Workbench.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Serein.Workbench.Views
{
/// <summary>
/// CanvasNodeTreeView.xaml 的交互逻辑
/// </summary>
public partial class CanvasInfoView : UserControl
{
private readonly CanvasInfoViewModel ViewModel;
public CanvasInfoView()
{
this.ViewModel = App.GetService<CanvasInfoViewModel>();
this.DataContext = this.ViewModel;
InitializeComponent();
}
}
}

View File

@@ -374,14 +374,14 @@ namespace Serein.Workbench.Views
// 准备放置条件表达式控件
if (nodeControl.ViewModel.NodeModel.ControlType == NodeControlType.ExpCondition)
{
ConditionRegionControl? conditionRegion = WpfFuncTool.GetParentOfType<ConditionRegionControl>(hitElement);
/* ConditionRegionControl? conditionRegion = WpfFuncTool.GetParentOfType<ConditionRegionControl>(hitElement);
if (conditionRegion is not null)
{
targetNodeControl = conditionRegion;
//// 如果存在条件区域容器
//conditionRegion.AddCondition(nodeControl);
return true;
}
}*/
}
else
@@ -408,13 +408,24 @@ namespace Serein.Workbench.Views
/// <param name="key"></param>
private void KeyEventService_OnKeyDown(Key key)
{
if (!flowNodeService.CurrentSelectCanvas.Guid.Equals(Guid))
if (flowNodeService.CurrentSelectCanvas is null || !flowNodeService.CurrentSelectCanvas.Guid.Equals(Guid))
{
return;
}
if (key == Key.F5)
{
// F5 调试当前流程
_ = flowEnvironment.StartFlowAsync([Guid]);
}
if (key == Key.Escape)
{
// 退出连线、选取状态
IsControlDragging = false;
IsCanvasDragging = false;
SelectionRectangle.Visibility = Visibility.Collapsed;
@@ -427,16 +438,33 @@ namespace Serein.Workbench.Views
if (selectNodeControls.Count > 0 && key == Key.C && (keyEventService.GetKeyState(Key.LeftCtrl) || keyEventService.GetKeyState(Key.RightCtrl)))
{
var text = flowNodeService.CpoyNodeInfo([.. selectNodeControls.Select(c => c.ViewModel.NodeModel)]);
Clipboard.SetDataObject(text, true); // 复制,持久性设置
return;
//Clipboard.SetText(text); // 复制,持久性设置
try
{
Clipboard.SetDataObject(text, true); // 复制,持久性设置
}
catch
{
Clipboard.SetText(text);
return;
}
}
// 粘贴节点
if (key == Key.V && (keyEventService.GetKeyState(Key.LeftCtrl) || keyEventService.GetKeyState(Key.RightCtrl)))
{
string clipboardText = Clipboard.GetText(TextDataFormat.Text); // 获取复制的文本
var jobject = JObject.Parse(clipboardText);
var nodesText = jobject["nodes"]?.ToString();
string nodesText = "";
try
{
var jobject = JObject.Parse(clipboardText);
nodesText = jobject["nodes"]?.ToString();
}
catch (Exception ex)
{
return;
}
if (!string.IsNullOrWhiteSpace(nodesText))
{
@@ -596,7 +624,7 @@ namespace Serein.Workbench.Views
{
NodeControlType nodeControlType = droppedType switch
{
Type when typeof(ConditionRegionControl).IsAssignableFrom(droppedType) => NodeControlType.ConditionRegion, // 条件区域
//Type when typeof(ConditionRegionControl).IsAssignableFrom(droppedType) => NodeControlType.ConditionRegion, // 条件区域
Type when typeof(ConditionNodeControl).IsAssignableFrom(droppedType) => NodeControlType.ExpCondition,
Type when typeof(ExpOpNodeControl).IsAssignableFrom(droppedType) => NodeControlType.ExpOp,
Type when typeof(GlobalDataControl).IsAssignableFrom(droppedType) => NodeControlType.GlobalData,

View File

@@ -4,11 +4,11 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Serein.Workbench.Views"
xmlns:converters="clr-namespace:Serein.Workbench.Tool.Converters"
xmlns:vm="clr-namespace:Serein.Workbench.ViewModels"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:DesignInstance vm:FlowEditViewModel}"
xmlns:converters="clr-namespace:Serein.Workbench.Tool.Converters"
Background="#E7F0F6">
<UserControl.Resources>
<converters:InvertableBooleanToVisibilityConverter x:Key="InvertableBooleanToVisibilityConverter"/>
@@ -17,19 +17,20 @@
<Grid>
<TabControl SelectedItem="{Binding SelectedTab}"
ItemsSource="{Binding CanvasTabs}"
SelectionChanged="TabControl_SelectionChanged"
x:Name="CanvasTab">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel >
<!-- 双击选项卡名称来进入编辑模式 -->
<TextBlock Text="{Binding Name}"
<TextBlock Text="{Binding Model.Name}"
FontSize="18"
Visibility="{Binding IsEditing, Converter={StaticResource InvertableBooleanToVisibilityConverter},ConverterParameter=Inverted}"
Visibility="{Binding IsEditing, Converter={StaticResource InvertableBooleanToVisibilityConverter},ConverterParameter=Inverted}"
PreviewMouseLeftButtonDown="TextBlock_PreviewMouseLeftButtonDown"
MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
<!-- 编辑模式下显示TextBox -->
<TextBox Text="{Binding Name, Mode=TwoWay}"
<TextBox Text="{Binding Model.Name, Mode=TwoWay}"
FontSize="18"
Visibility="{Binding IsEditing, Converter={StaticResource InvertableBooleanToVisibilityConverter},ConverterParameter=Normal}"
KeyDown="TextBox_KeyDown" />
@@ -37,10 +38,7 @@
</DataTemplate>
</TabControl.ItemTemplate>
<!-- Tabs Collection -->
<TabControl.ItemsSource>
<Binding Path="CanvasTabs" />
</TabControl.ItemsSource>
<!-- Content of the Tab (e.g., FlowCanvasView) -->
<TabControl.ContentTemplate>

View File

@@ -39,6 +39,8 @@
<!--流程编辑区-->
<local:FlowEditView Grid.Row="1" Grid.Column="2"/>
<!--编辑区和视图区的分割线-->
<GridSplitter Grid.Row="1" Grid.Column="3" Width="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Background="#CCD5F0" />
<GridSplitter Grid.Row="1" Grid.Column="3" Width="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Background="#CCD5F0" />
<local:CanvasInfoView Grid.Row="1" Grid.Column="4" />
</Grid>
</Window>