mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-05-04 06:51:28 +08:00
工具栏整理
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:controls="clr-namespace:AIStudio.Wpf.Mind.Controls">
|
||||
xmlns:controls="clr-namespace:AIStudio.Wpf.Mind.Controls"
|
||||
xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram">
|
||||
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Styles/Button.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Styles/ContextMenu.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
|
||||
<dd:BrushOpacityConverter x:Key="BrushOpacityConverter"/>
|
||||
|
||||
<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
|
||||
<Setter Property="Padding" Value="6"/>
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
@@ -151,22 +154,6 @@
|
||||
</Button>
|
||||
|
||||
</Border>
|
||||
<!--<Popup x:Name="PART_Popup"
|
||||
Placement="Bottom"
|
||||
IsOpen="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
|
||||
AllowsTransparency="True"
|
||||
Margin="0,0,-4,0">
|
||||
<Border>
|
||||
<ScrollViewer x:Name="PART_ScrollViewer"
|
||||
IsTabStop="False"
|
||||
Margin="1"
|
||||
SnapsToDevicePixels="True"
|
||||
VerticalScrollBarVisibility="Auto"
|
||||
HorizontalScrollBarVisibility="Hidden">
|
||||
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Local" />
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Popup>-->
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="Content" Value="{x:Null}">
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram"
|
||||
xmlns:controls="clr-namespace:AIStudio.Wpf.Mind.Controls"
|
||||
xmlns:models="clr-namespace:AIStudio.Wpf.Mind.Models"
|
||||
xmlns:converter="clr-namespace:AIStudio.Wpf.Mind.Converters"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800" >
|
||||
<UserControl.Resources>
|
||||
@@ -13,11 +15,14 @@
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Styles/Button.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Styles/ToggleButton.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Controls/DropDownButton.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Styles/ComboBox.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/AIStudio.Wpf.Mind;component/Controls/DropDownButton.xaml" />
|
||||
<ResourceDictionary>
|
||||
<dd:ColorBrushConverter x:Key="ColorBrushConverter"/>
|
||||
<dd:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/>
|
||||
<dd:ObjectConverter x:Key="ObjectConverter"/>
|
||||
<converter:MindThemeFillBrushConverter x:Key="MindThemeFillBrushConverter"/>
|
||||
<converter:MindThemeFontBrushConverter x:Key="MindThemeFontBrushConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
@@ -411,50 +416,33 @@
|
||||
</TabItem>
|
||||
<TabItem Header="外观" Height="30" Width="50">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<controls:DropDownButton>
|
||||
<controls:DropDownButton.Content>
|
||||
<Border CornerRadius="3">
|
||||
<TextBlock Margin="5" Width="60" TextAlignment="Center" Text="{Binding MindType,Converter={StaticResource EnumDescriptionConverter}}"></TextBlock>
|
||||
</Border>
|
||||
</controls:DropDownButton.Content>
|
||||
<controls:DropDownButton.Items>
|
||||
<MenuItem Header="思维导图" IsCheckable="True" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='Mind'}, ConverterParameter='Mind'}" />
|
||||
<MenuItem Header="目录组织图" IsCheckable="True" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='Directory'}, ConverterParameter='Directory'}" />
|
||||
<MenuItem Header="鱼骨头图" IsCheckable="True" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='FishBone'}, ConverterParameter='FishBone'}" />
|
||||
<MenuItem Header="逻辑结构图" IsCheckable="True" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='Logical'}, ConverterParameter='Logical'}" />
|
||||
<MenuItem Header="组织结构图" IsCheckable="True" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='Organizational'}, ConverterParameter='Organizational'}" />
|
||||
<MenuItem Header="天盘图" IsCheckable="True" IsEnabled="False" ToolTip="暂未完成" IsChecked="{Binding MindType,Converter={dd:ConverterValueMapToBool Parameter='Celestial'}, ConverterParameter='Celestial'}" />
|
||||
</controls:DropDownButton.Items>
|
||||
</controls:DropDownButton>
|
||||
<ComboBox x:Name="mindtype" dd:EnumHelper.Enum="{x:Type models:MindType}" SelectedItem="{Binding MindType, Mode=OneWay}" Style="{StaticResource FlatComboBoxStyle}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding .,Converter={StaticResource EnumDescriptionConverter}}" VerticalAlignment="Center" />
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
<i:Interaction.Triggers>
|
||||
<i:EventTrigger EventName="SelectionChanged">
|
||||
<i:InvokeCommandAction Command="{Binding ChangeMindTypeCommand}" CommandParameter="{Binding ElementName=mindtype,Path=SelectedItem}"/>
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</ComboBox>
|
||||
<Line Margin="2,0" X1="0" Y1="0" X2="0" Y2="100" StrokeDashArray="1" Stroke="Gray" StrokeThickness="1"></Line>
|
||||
<controls:DropDownButton>
|
||||
<controls:DropDownButton.Content>
|
||||
<Border Background="{Binding MindThemeModel.MindThemeLevel1.FillColor,Converter={StaticResource ColorBrushConverter}}" CornerRadius="3">
|
||||
<TextBlock Margin="5" Text="{Binding MindThemeModel.Name}"></TextBlock>
|
||||
</Border>
|
||||
</controls:DropDownButton.Content>
|
||||
<controls:DropDownButton.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<UniformGrid Columns="2"/>
|
||||
</ItemsPanelTemplate>
|
||||
</controls:DropDownButton.ItemsPanel>
|
||||
<controls:DropDownButton.Items>
|
||||
<MenuItem Header="天空蓝" Background="#73a1bf" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="天空蓝"/>
|
||||
<MenuItem Header="紧凑蓝" Background="#73a1bf" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑蓝"/>
|
||||
<MenuItem Header="文艺绿" Background="#73bf76" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="文艺绿"/>
|
||||
<MenuItem Header="紧凑绿" Background="#73bf76" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑绿"/>
|
||||
<MenuItem Header="脑残粉" Background="#bf7394" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="脑残粉"/>
|
||||
<MenuItem Header="紧凑粉" Background="#bf7394" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑粉"/>
|
||||
<MenuItem Header="浪漫紫" Background="#7b73bf" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="浪漫紫"/>
|
||||
<MenuItem Header="紧凑紫" Background="#7b73bf" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑紫"/>
|
||||
<MenuItem Header="清新红" Background="#bf7373" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="清新红"/>
|
||||
<MenuItem Header="紧凑红" Background="#bf7373" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑红"/>
|
||||
<MenuItem Header="泥土黄" Background="#bf9373" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="泥土黄"/>
|
||||
<MenuItem Header="紧凑黄" Background="#bf9373" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑黄"/>
|
||||
<MenuItem Header="冷光黄" Background="#e9df98" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="冷光黄"/>
|
||||
<MenuItem Header="紧凑黄" Background="#e9df98" Margin="1.5" Command="{Binding ChangeMindThemeCommand}" CommandParameter="紧凑冷"/>
|
||||
</controls:DropDownButton.Items>
|
||||
</controls:DropDownButton>
|
||||
<ComboBox x:Name="mindtheme" dd:EnumHelper.Enum="{x:Type models:MindTheme}" SelectedItem="{Binding MindTheme, Mode=OneWay}" Style="{StaticResource FlatComboBox2ColumnStyle}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border CornerRadius="3" Background="{Binding .,Converter={StaticResource MindThemeFillBrushConverter}}" Padding="5">
|
||||
<TextBlock Foreground="{Binding .,Converter={StaticResource MindThemeFontBrushConverter}}" Text="{Binding .,Converter={StaticResource EnumDescriptionConverter}}" VerticalAlignment="Center" />
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
<i:Interaction.Triggers>
|
||||
<i:EventTrigger EventName="SelectionChanged">
|
||||
<i:InvokeCommandAction Command="{Binding ChangeMindThemeCommand}" CommandParameter="{Binding ElementName=mindtheme,Path=SelectedItem}"/>
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</ComboBox>
|
||||
<Line Margin="2,0" X1="0" Y1="0" X2="0" Y2="100" StrokeDashArray="1" Stroke="Gray" StrokeThickness="1"></Line>
|
||||
<Button Style="{StaticResource FlatButtonStyle}" Command="{Binding ResetLayoutCommand}">
|
||||
<StackPanel>
|
||||
@@ -499,12 +487,12 @@
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<ComboBox x:Name="comboBoxFontName"
|
||||
Width="80"
|
||||
BorderBrush="Gainsboro"
|
||||
Width="100"
|
||||
IsTextSearchEnabled="True"
|
||||
ScrollViewer.CanContentScroll="False"
|
||||
ItemsSource="{Binding SelectedItem.FontViewModel.FontFamilys}"
|
||||
SelectedItem="{Binding SelectedItem.FontViewModel.FontFamily}">
|
||||
SelectedItem="{Binding SelectedItem.FontViewModel.FontFamily}"
|
||||
Style="{StaticResource FlatComboBoxStyle}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}"
|
||||
@@ -515,10 +503,10 @@
|
||||
<ComboBox x:Name="comboBoxFontSize"
|
||||
Width="50"
|
||||
HorizontalAlignment="Left"
|
||||
BorderBrush="Gainsboro"
|
||||
IsEditable="True"
|
||||
ItemsSource="{Binding SelectedItem.FontViewModel.FontSizes}"
|
||||
Text="{Binding SelectedItem.FontViewModel.FontSize}">
|
||||
Text="{Binding SelectedItem.FontViewModel.FontSize}"
|
||||
Style="{StaticResource FlatComboBoxStyle}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}"/>
|
||||
|
||||
28
AIStudio.Wpf.Mind/Converters/MindThemeFillBrushConverter.cs
Normal file
28
AIStudio.Wpf.Mind/Converters/MindThemeFillBrushConverter.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Media;
|
||||
using AIStudio.Wpf.Mind.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Converters
|
||||
{
|
||||
public class MindThemeFillBrushConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is MindTheme mindTheme)
|
||||
{
|
||||
var mindThemeModel = MindThemeHelper.GetTheme(mindTheme);
|
||||
return new SolidColorBrush(mindThemeModel.MindThemeLevel0.FillColor);
|
||||
}
|
||||
|
||||
return new SolidColorBrush();
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
29
AIStudio.Wpf.Mind/Converters/MindThemeFontBrushConverter.cs
Normal file
29
AIStudio.Wpf.Mind/Converters/MindThemeFontBrushConverter.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Media;
|
||||
using AIStudio.Wpf.Mind.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Converters
|
||||
{
|
||||
public class MindThemeFontBrushConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is MindTheme mindTheme)
|
||||
{
|
||||
var mindThemeModel = MindThemeHelper.GetTheme(mindTheme);
|
||||
return new SolidColorBrush(mindThemeModel.MindThemeLevel0.FontColor);
|
||||
}
|
||||
|
||||
return new SolidColorBrush();
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -15,10 +16,10 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
public void Appearance(MindNode mindNode)
|
||||
{
|
||||
Appearance(mindNode, null, false);
|
||||
Appearance(mindNode, MindTheme.SkyBlue, false);
|
||||
}
|
||||
|
||||
public void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance)
|
||||
public void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance)
|
||||
{
|
||||
switch (mindNode.NodeLevel)
|
||||
{
|
||||
@@ -26,7 +27,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Bottom, true) { XRatio = 0.5, YRatio = 1 };
|
||||
@@ -42,7 +43,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Top, true) { XRatio = 0.5, YRatio = 0 };
|
||||
@@ -59,7 +60,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 0.5 };
|
||||
|
||||
@@ -7,6 +7,7 @@ using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -15,10 +16,10 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
public void Appearance(MindNode mindNode)
|
||||
{
|
||||
Appearance(mindNode, null, false);
|
||||
Appearance(mindNode, MindTheme.SkyBlue, false);
|
||||
}
|
||||
|
||||
public void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance)
|
||||
public void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance)
|
||||
{
|
||||
if (mindNode == null) return;
|
||||
|
||||
@@ -30,7 +31,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Right, true) { XRatio = 1, YRatio = 0.5 };
|
||||
@@ -45,7 +46,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.BottomLeft, true) { XRatio = 0, YRatio = 1 };
|
||||
@@ -62,8 +63,8 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
default:
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 0.5 };
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows.Media;
|
||||
using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -10,7 +11,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
public interface IMindLayout
|
||||
{
|
||||
void Appearance(MindNode mindNode);
|
||||
void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance);
|
||||
void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance);
|
||||
ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null);
|
||||
void LayoutUpdated(MindNode mindNode);
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -15,10 +16,10 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
public void Appearance(MindNode mindNode)
|
||||
{
|
||||
Appearance(mindNode, null, false);
|
||||
Appearance(mindNode, MindTheme.SkyBlue, false);
|
||||
}
|
||||
|
||||
public void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance)
|
||||
public void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance)
|
||||
{
|
||||
switch (mindNode.NodeLevel)
|
||||
{
|
||||
@@ -26,7 +27,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.None, true) { XRatio = 0.5, YRatio = 0.5 };
|
||||
@@ -41,7 +42,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 0.5 };
|
||||
@@ -58,7 +59,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 1 };
|
||||
|
||||
@@ -7,6 +7,7 @@ using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -15,10 +16,10 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
public void Appearance(MindNode mindNode)
|
||||
{
|
||||
Appearance(mindNode, null, false);
|
||||
Appearance(mindNode, MindTheme.SkyBlue, false);
|
||||
}
|
||||
|
||||
public void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance)
|
||||
public void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance)
|
||||
{
|
||||
switch (mindNode.NodeLevel)
|
||||
{
|
||||
@@ -26,7 +27,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.None, true) { XRatio = 0.5, YRatio = 0.5 };
|
||||
@@ -41,7 +42,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 0.5 };
|
||||
@@ -58,7 +59,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 1 };
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@ using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Helpers
|
||||
@@ -15,10 +16,10 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
public void Appearance(MindNode mindNode)
|
||||
{
|
||||
Appearance(mindNode, null, false);
|
||||
Appearance(mindNode, MindTheme.SkyBlue, false);
|
||||
}
|
||||
|
||||
public void Appearance(MindNode mindNode, MindThemeModel mindThemeModel, bool initAppearance)
|
||||
public void Appearance(MindNode mindNode, MindTheme mindTheme, bool initAppearance)
|
||||
{
|
||||
switch (mindNode.NodeLevel)
|
||||
{
|
||||
@@ -26,7 +27,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Bottom, true) { XRatio = 0.5, YRatio = 1 };
|
||||
@@ -41,7 +42,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Top, true) { XRatio = 0.5, YRatio = 0 };
|
||||
@@ -59,7 +60,7 @@ namespace AIStudio.Wpf.Mind.Helpers
|
||||
{
|
||||
if (initAppearance)
|
||||
{
|
||||
MindThemeHelper.ThemeChange(mindNode, mindThemeModel, initAppearance);
|
||||
MindThemeHelper.ThemeChange(mindNode, mindTheme, initAppearance);
|
||||
|
||||
mindNode.ClearConnectors();
|
||||
var port1 = new FullyCreatedConnectorInfo(mindNode.Root, mindNode, ConnectorOrientation.Top, true) { XRatio = 0.5, YRatio = 0 };
|
||||
|
||||
@@ -9,7 +9,7 @@ using AIStudio.Wpf.DiagramModels.ViewModels;
|
||||
using AIStudio.Wpf.Mind;
|
||||
using AIStudio.Wpf.Mind.ViewModels;
|
||||
|
||||
namespace AIStudio.Wpf.Flowchart.Models
|
||||
namespace AIStudio.Wpf.Mind.Models
|
||||
{
|
||||
|
||||
public class MindNodeModel : DiagramNode
|
||||
|
||||
41
AIStudio.Wpf.Mind/Models/MindTheme.cs
Normal file
41
AIStudio.Wpf.Mind/Models/MindTheme.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.Models
|
||||
{
|
||||
public enum MindTheme
|
||||
{
|
||||
[Description("天空蓝")]
|
||||
SkyBlue,
|
||||
[Description("紧凑蓝")]
|
||||
SkyBlueMini,
|
||||
[Description("文艺绿")]
|
||||
LiteratureGreen,
|
||||
[Description("紧凑绿")]
|
||||
LiteratureGreenMini,
|
||||
[Description("脑残粉")]
|
||||
BrainDeadPink,
|
||||
[Description("紧凑粉")]
|
||||
BrainDeadPinkMini,
|
||||
[Description("浪漫紫")]
|
||||
RomanticPurple,
|
||||
[Description("紧凑紫")]
|
||||
RomanticPurpleMini,
|
||||
[Description("清新红")]
|
||||
FreshRed,
|
||||
[Description("紧凑红")]
|
||||
FreshRedMini,
|
||||
[Description("泥土黄")]
|
||||
EarthyYellow,
|
||||
[Description("紧凑黄")]
|
||||
EarthyYellowMini,
|
||||
[Description("冷光黄")]
|
||||
CoolLightYellow,
|
||||
[Description("紧凑黄")]
|
||||
CoolLightYellowMini,
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Text;
|
||||
|
||||
namespace AIStudio.Wpf.Mind
|
||||
namespace AIStudio.Wpf.Mind.Models
|
||||
{
|
||||
public enum MindType
|
||||
{
|
||||
@@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind
|
||||
Logical,
|
||||
[Description("组织结构图")]
|
||||
Organizational,
|
||||
[Description("天盘图")]
|
||||
[Description("天盘图(暂未完成)")]
|
||||
Celestial
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ using System.Windows.Markup;
|
||||
|
||||
[assembly: XmlnsDefinition("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "AIStudio.Wpf.Mind")]
|
||||
[assembly: XmlnsDefinition("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "AIStudio.Wpf.Mind.Controls")]
|
||||
[assembly: XmlnsDefinition("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "AIStudio.Wpf.Mind.Controls")]
|
||||
[assembly: XmlnsDefinition("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "AIStudio.Wpf.Mind.Models")]
|
||||
[assembly: XmlnsDefinition("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "AIStudio.Wpf.Mind.Converters")]
|
||||
|
||||
[assembly: XmlnsPrefix("https://gitee.com/akwkevin/aistudio.-wpf.-diagram", "dd")]
|
||||
|
||||
160
AIStudio.Wpf.Mind/Styles/ComboBox.xaml
Normal file
160
AIStudio.Wpf.Mind/Styles/ComboBox.xaml
Normal file
@@ -0,0 +1,160 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram">
|
||||
|
||||
<dd:BrushOpacityConverter x:Key="BrushOpacityConverter"/>
|
||||
|
||||
<Geometry x:Key="DownArrowGeometry">M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z</Geometry>
|
||||
|
||||
<Style x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
|
||||
<Setter Property="Foreground" Value="Black" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ToggleButton">
|
||||
<Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ContentPresenter Content="{TemplateBinding Content}"
|
||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||
ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
|
||||
|
||||
<Grid x:Name="arrowGlyph" Grid.Column="1">
|
||||
<Path x:Name="Arrow"
|
||||
Width="9"
|
||||
Height="6"
|
||||
Margin="0 0 3 0"
|
||||
Stretch="Fill"
|
||||
Data="{StaticResource DownArrowGeometry}"
|
||||
Fill="#FF000000"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="true">
|
||||
<Setter TargetName="Arrow" Property="Fill" Value="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent},
|
||||
Converter={StaticResource BrushOpacityConverter}, ConverterParameter=0.16}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="FlatComboBoxStyle" TargetType="{x:Type ComboBox}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="Black" />
|
||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="3" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ComboBox}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="15" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Border x:Name="border" Grid.Column="0" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="3"/>
|
||||
<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>
|
||||
|
||||
<!--ToggleButton 已数据绑定到 ComboBox 本身以切换 IsDropDownOpen-->
|
||||
<ToggleButton Grid.Column="0" Grid.ColumnSpan="2" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" Style="{StaticResource ComboBoxToggleButton}"/>
|
||||
<!--必须将 TextBox 命名为 PART_EditableTextBox,否则 ComboBox 将无法识别它-->
|
||||
<TextBox Visibility="Hidden" BorderThickness="0" Margin="2 0 0 0" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
|
||||
|
||||
<!--Popup 可显示 ComboBox 中的项列表。IsOpen 已数据绑定到通过 ComboBoxToggleButton 来切换的 IsDropDownOpen-->
|
||||
<Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
|
||||
<Grid MaxHeight="400" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
|
||||
<Border x:Name="DropDownBorder" BorderBrush="#e8e8e8" BorderThickness="1 0 1 1"/>
|
||||
<ScrollViewer Margin="1" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">
|
||||
<!--StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True-->
|
||||
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Background="White"/>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</Popup>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsEditable" Value="true">
|
||||
<Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" />
|
||||
</Trigger>
|
||||
<!--设置鼠标进入时的背景、前景样式-->
|
||||
<Trigger Property="IsMouseOver" Value="true">
|
||||
<Setter Property="Background" TargetName="border" Value="{Binding Foreground,
|
||||
RelativeSource={RelativeSource Mode=TemplatedParent},
|
||||
Converter={StaticResource BrushOpacityConverter},
|
||||
ConverterParameter=0.16}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="false">
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="FlatComboBox2ColumnStyle" TargetType="{x:Type ComboBox}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="Black" />
|
||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="3" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ComboBox}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="15" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Border x:Name="border" Grid.Column="0" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="3"/>
|
||||
<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>
|
||||
|
||||
<!--ToggleButton 已数据绑定到 ComboBox 本身以切换 IsDropDownOpen-->
|
||||
<ToggleButton Grid.Column="0" Grid.ColumnSpan="2" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" Style="{StaticResource ComboBoxToggleButton}"/>
|
||||
<!--必须将 TextBox 命名为 PART_EditableTextBox,否则 ComboBox 将无法识别它-->
|
||||
<TextBox Visibility="Hidden" BorderThickness="0" Margin="2 0 0 0" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
|
||||
|
||||
<!--Popup 可显示 ComboBox 中的项列表。IsOpen 已数据绑定到通过 ComboBoxToggleButton 来切换的 IsDropDownOpen-->
|
||||
<Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
|
||||
<Grid MaxHeight="400" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
|
||||
<Border x:Name="DropDownBorder" BorderBrush="#e8e8e8" BorderThickness="1 0 1 1"/>
|
||||
<ScrollViewer Margin="1" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">
|
||||
<!--StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True-->
|
||||
<UniformGrid Columns="2" IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Background="White"/>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</Popup>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsEditable" Value="true">
|
||||
<Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" />
|
||||
</Trigger>
|
||||
<!--设置鼠标进入时的背景、前景样式-->
|
||||
<Trigger Property="IsMouseOver" Value="true">
|
||||
<Setter Property="Background" TargetName="border" Value="{Binding Foreground,
|
||||
RelativeSource={RelativeSource Mode=TemplatedParent},
|
||||
Converter={StaticResource BrushOpacityConverter},
|
||||
ConverterParameter=0.16}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="false">
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
||||
@@ -1,11 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Input;
|
||||
using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.Mind.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.ViewModels
|
||||
{
|
||||
@@ -16,7 +12,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
get; set;
|
||||
}
|
||||
|
||||
MindThemeModel MindThemeModel
|
||||
MindTheme MindTheme
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Windows.Input;
|
||||
@@ -7,13 +8,14 @@ using System.Windows.Media;
|
||||
using AIStudio.Wpf.DiagramDesigner;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
using AIStudio.Wpf.Mind.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
|
||||
namespace AIStudio.Wpf.Mind.ViewModels
|
||||
{
|
||||
public class MindDiagramViewModel : DiagramViewModel, IMindDiagramViewModel
|
||||
{
|
||||
#region
|
||||
private MindType _mindType = Mind.MindType.Mind;
|
||||
private MindType _mindType = MindType.Mind;
|
||||
public MindType MindType
|
||||
{
|
||||
get
|
||||
@@ -22,26 +24,23 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
}
|
||||
set
|
||||
{
|
||||
var oldvalue = _mindType;
|
||||
if (SetProperty(ref _mindType, value))
|
||||
{
|
||||
ExecutedChangeMindType(oldvalue, value);
|
||||
}
|
||||
SetProperty(ref _mindType, value);
|
||||
}
|
||||
}
|
||||
|
||||
private MindThemeModel _mindThemeModel = MindThemeHelper.GetTheme("天空蓝");
|
||||
public MindThemeModel MindThemeModel
|
||||
private MindTheme _mindTheme;
|
||||
public MindTheme MindTheme
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mindThemeModel;
|
||||
return _mindTheme;
|
||||
}
|
||||
set
|
||||
{
|
||||
SetProperty(ref _mindThemeModel, value);
|
||||
SetProperty(ref _mindTheme, value);
|
||||
}
|
||||
}
|
||||
|
||||
public List<MindNode> RootItems
|
||||
{
|
||||
get
|
||||
@@ -58,6 +57,14 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public List<MindNode> MindSelectedItems
|
||||
{
|
||||
get
|
||||
{
|
||||
return SelectedItems.OfType<MindNode>().ToList();
|
||||
}
|
||||
}
|
||||
|
||||
private LinkInfo _linkInfo = new LinkInfo();
|
||||
public LinkInfo LinkInfo
|
||||
{
|
||||
@@ -354,7 +361,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
private MindNode AddRootItem()
|
||||
{
|
||||
ClearSelectedItems();
|
||||
MindNode level1node = new MindNode(this) { Root = this, Id = Guid.NewGuid(), Text = "思维导图" };
|
||||
MindNode level1node = new MindNode(this) { Root = this, Id = Guid.NewGuid(), Text = "思维导图", MindType = MindType, MindTheme = MindTheme };
|
||||
level1node.InitLayout(true);
|
||||
Items.Add(level1node);
|
||||
level1node.IsSelected = true;
|
||||
@@ -422,6 +429,11 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
LinkInfo = new LinkInfo(MindSelectedItem?.LinkInfo);
|
||||
ImageInfo = new ImageInfo(MindSelectedItem?.ImageInfo);
|
||||
Remark = MindSelectedItem?.Remark;
|
||||
if (MindSelectedItem != null)
|
||||
{
|
||||
MindType = MindSelectedItem.MindType;
|
||||
MindTheme = MindSelectedItem.MindTheme;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -975,37 +987,42 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
#region 改变模式,主题
|
||||
private void ExecutedChangeMindTypeCommand(object obj)
|
||||
{
|
||||
if (obj is MindType mindType)
|
||||
var oldMindType = MindType;
|
||||
if (obj is MindType mindType && mindType != oldMindType)
|
||||
{
|
||||
MindType = mindType;
|
||||
var roots = MindSelectedItems.Select(p => p.RootNode).Distinct().ToList();
|
||||
if (roots.Count > 0)
|
||||
{
|
||||
DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
roots.ForEach(p => p.MindType = mindType);
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitLayout(true); });
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitConnectLayout(); });
|
||||
roots.ForEach(p => p.LayoutUpdated());
|
||||
},
|
||||
() => {
|
||||
roots.ForEach(p => p.MindType = oldMindType);
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitLayout(true); });
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitConnectLayout(); });
|
||||
roots.ForEach(p => p.LayoutUpdated());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ExecutedChangeMindType(MindType oldvalue, MindType newvalue)
|
||||
{
|
||||
DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitLayout(true); });
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitConnectLayout(); });
|
||||
RootItems?.ForEach(p => p.LayoutUpdated());
|
||||
},
|
||||
() => {
|
||||
_mindType = oldvalue;
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitLayout(true); });
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitConnectLayout(); });
|
||||
RootItems?.ForEach(p => p.LayoutUpdated());
|
||||
});
|
||||
}
|
||||
|
||||
private void ExecutedChangeMindThemeCommand(object obj)
|
||||
{
|
||||
string oldmindThemeModel = MindThemeModel.Name;
|
||||
if (obj is string mindThemeModel && mindThemeModel != oldmindThemeModel)
|
||||
var oldmindTheme = MindTheme;
|
||||
if (obj is MindTheme mindTheme && mindTheme != oldmindTheme)
|
||||
{
|
||||
DoCommandManager.DoNewCommand(this.ToString(),
|
||||
var roots = MindSelectedItems.Select(p => p.RootNode).Distinct().ToList();
|
||||
if (roots.Count > 0)
|
||||
{
|
||||
DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
MindThemeModel = MindThemeHelper.GetTheme(mindThemeModel);
|
||||
if (MindThemeModel?.Dark == true)
|
||||
var mindThemeModel = MindThemeHelper.GetTheme(mindTheme);
|
||||
if (mindThemeModel?.Dark == true)
|
||||
{
|
||||
PageBackground = Colors.Black;
|
||||
}
|
||||
@@ -1013,11 +1030,14 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
{
|
||||
PageBackground = Colors.White;
|
||||
}
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.ThemeChange(); });
|
||||
MindTheme = mindTheme;
|
||||
roots.ForEach(p => p.MindTheme = MindTheme);
|
||||
roots.SelectMany(p => p.GetChildren(true)).ToList().ForEach(item => { item.ThemeChange(); });
|
||||
roots.ForEach(p => p.LayoutUpdated());
|
||||
},
|
||||
() => {
|
||||
MindThemeModel = MindThemeHelper.GetTheme(oldmindThemeModel);
|
||||
if (MindThemeModel?.Dark == true)
|
||||
var mindThemeModel = MindThemeHelper.GetTheme(oldmindTheme);
|
||||
if (mindThemeModel?.Dark == true)
|
||||
{
|
||||
PageBackground = Colors.Black;
|
||||
}
|
||||
@@ -1025,8 +1045,12 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
{
|
||||
PageBackground = Colors.White;
|
||||
}
|
||||
Items.OfType<MindNode>().ToList().ForEach(item => { item.ThemeChange(); });
|
||||
MindTheme = oldmindTheme;
|
||||
roots.ForEach(p => p.MindTheme = MindTheme);
|
||||
roots.SelectMany(p => p.GetChildren(true)).ToList().ForEach(item => { item.ThemeChange(); });
|
||||
roots.ForEach(p => p.LayoutUpdated());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1048,7 +1072,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
|
||||
if (items.Any())
|
||||
{
|
||||
Dictionary<MindNode, MindThemeModel> infos = items.OfType<MindNode>().ToDictionary(p => p, p => MindThemeHelper.GetThemeModel(p));
|
||||
Dictionary<MindNode, MindThemeModel> infos = items.OfType<MindNode>().ToDictionary(p => p, p => MindThemeHelper.GetNodeTheme(p));
|
||||
DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
foreach (var item in items)
|
||||
@@ -1144,7 +1168,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
|
||||
private void Move(MindNode rootitem, double? left, double? top)
|
||||
{
|
||||
|
||||
|
||||
if (left == null)
|
||||
left = (PageSize.Width - rootitem.ItemWidth) / 2;
|
||||
if (top == null)
|
||||
|
||||
@@ -18,7 +18,7 @@ using AIStudio.Wpf.DiagramDesigner.Helpers;
|
||||
using AIStudio.Wpf.DiagramDesigner.Models;
|
||||
using AIStudio.Wpf.DiagramModels;
|
||||
using AIStudio.Wpf.DiagramModels.ViewModels;
|
||||
using AIStudio.Wpf.Flowchart.Models;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
using AIStudio.Wpf.Mind.Helpers;
|
||||
using AIStudio.Wpf.Mind.Models;
|
||||
|
||||
@@ -96,18 +96,18 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
|
||||
public void InitLayout(bool initAppearance)
|
||||
{
|
||||
var layout = TypeHelper.GetType(MindType.ToString() + "Layout");
|
||||
var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout");
|
||||
MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout();
|
||||
|
||||
this.PropertyChanged -= this.Item_PropertyChanged;
|
||||
IsInnerConnector = true;
|
||||
MindLayout.Appearance(this, MindThemeModel, initAppearance);
|
||||
MindLayout.Appearance(this, MindTheme, initAppearance);
|
||||
this.PropertyChanged += this.Item_PropertyChanged;
|
||||
}
|
||||
|
||||
public void ThemeChange()
|
||||
{
|
||||
MindThemeHelper.ThemeChange(this, MindThemeModel);
|
||||
MindThemeHelper.ThemeChange(this, MindTheme);
|
||||
}
|
||||
|
||||
protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase)
|
||||
@@ -145,6 +145,32 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
}
|
||||
}
|
||||
#region 属性
|
||||
private MindType _mindType = MindType.Mind;
|
||||
public MindType MindType
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetLevel0Node()._mindType;
|
||||
}
|
||||
set
|
||||
{
|
||||
GetLevel0Node()._mindType = value;
|
||||
}
|
||||
}
|
||||
|
||||
private MindTheme _mindTheme;
|
||||
public MindTheme MindTheme
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetLevel0Node()._mindTheme;
|
||||
}
|
||||
set
|
||||
{
|
||||
GetLevel0Node()._mindTheme = value;
|
||||
}
|
||||
}
|
||||
|
||||
public IMindLayout MindLayout
|
||||
{
|
||||
get; set;
|
||||
@@ -181,22 +207,6 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public MindType MindType
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Root as IMindDiagramViewModel)?.MindType ?? MindType.Mind;
|
||||
}
|
||||
}
|
||||
|
||||
public MindThemeModel MindThemeModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Root as IMindDiagramViewModel)?.MindThemeModel ?? MindThemeHelper.GetTheme("天空蓝");
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isExpanded = true;
|
||||
public bool IsExpanded
|
||||
{
|
||||
@@ -560,62 +570,54 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
case nameof(NodeLevel):
|
||||
MindLayout?.Appearance(this);
|
||||
break;
|
||||
case nameof(Text):
|
||||
{
|
||||
ItemWidth = Math.Max(ItemWidth, GetTextDisplayWidthHelper.GetTextDisplayWidth(Text, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, FontViewModel.FontSize) + 30);
|
||||
break;
|
||||
}
|
||||
case nameof(Text):
|
||||
case nameof(Rate):
|
||||
case nameof(Priority):
|
||||
case nameof(Remark):
|
||||
{
|
||||
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||
{
|
||||
if (string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && !string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
|
||||
{
|
||||
ItemWidth += 24;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
|
||||
{
|
||||
ItemWidth -= 24;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case nameof(LinkInfo):
|
||||
{
|
||||
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||
{
|
||||
if (valuePropertyChangedEventArgs.OldValue == null && valuePropertyChangedEventArgs.NewValue != null)
|
||||
{
|
||||
ItemWidth += 24;
|
||||
}
|
||||
else if (valuePropertyChangedEventArgs.OldValue != null && valuePropertyChangedEventArgs.NewValue == null)
|
||||
{
|
||||
ItemWidth -= 24;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case nameof(ImageInfo):
|
||||
{
|
||||
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||
{
|
||||
if (valuePropertyChangedEventArgs.OldValue == null && valuePropertyChangedEventArgs.NewValue != null)
|
||||
{
|
||||
ItemWidth = Math.Max(ItemWidth, 160);
|
||||
ItemHeight += 135;
|
||||
}
|
||||
else if (valuePropertyChangedEventArgs.OldValue != null && valuePropertyChangedEventArgs.NewValue == null)
|
||||
{
|
||||
ItemHeight -= 135;
|
||||
}
|
||||
}
|
||||
SetItemWidthHeight();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetItemWidthHeight()
|
||||
{
|
||||
double width = 0;
|
||||
double height = 0;
|
||||
width += GetTextDisplayWidthHelper.GetTextDisplayWidth(Text, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, FontViewModel.FontSize) + 30;
|
||||
width += Rate == null ? 0 : 24;
|
||||
width += Priority == null ? 0 : 24;
|
||||
width += Remark == null ? 0 : 24;
|
||||
width += LinkInfo == null ? 0 : 24;
|
||||
|
||||
var defaultTheme = MindThemeHelper.GetNodeDefaultTheme(this);
|
||||
if (ImageInfo != null)
|
||||
{
|
||||
width = Math.Max(width, 160);
|
||||
height = defaultTheme.ItemHeight / defaultTheme.FontSize * FontViewModel.FontSize + 135;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = defaultTheme.ItemHeight / defaultTheme.FontSize * FontViewModel.FontSize;
|
||||
}
|
||||
|
||||
ItemWidth = width;
|
||||
ItemHeight = height;
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected override void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == nameof(FontViewModel.FontSize))
|
||||
{
|
||||
SetItemWidthHeight();
|
||||
}
|
||||
}
|
||||
|
||||
public override void AddToSelection(bool selected)
|
||||
{
|
||||
foreach (SelectableDesignerItemViewModelBase item in Root.SelectedItems.ToList())
|
||||
@@ -661,9 +663,14 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
||||
return mindnode;
|
||||
}
|
||||
|
||||
public List<MindNode> GetChildren()
|
||||
public List<MindNode> GetChildren(bool self = false)
|
||||
{
|
||||
List<MindNode> mindnode = new List<MindNode>();
|
||||
if (self)
|
||||
{
|
||||
mindnode.Add(this);
|
||||
}
|
||||
|
||||
if (this.Children != null)
|
||||
{
|
||||
foreach (var child in this.Children)
|
||||
|
||||
Reference in New Issue
Block a user