diff --git a/CPF.Toolkit.Demo/CPF.Toolkit.Demo.csproj b/CPF.Toolkit.Demo/CPF.Toolkit.Demo.csproj new file mode 100644 index 0000000..61bfbf6 --- /dev/null +++ b/CPF.Toolkit.Demo/CPF.Toolkit.Demo.csproj @@ -0,0 +1,19 @@ + + + + WinExe + net6.0 + enable + enable + + + + + + + + + + + + diff --git a/CPF.Toolkit.Demo/MainView.cs b/CPF.Toolkit.Demo/MainView.cs new file mode 100644 index 0000000..e44c0aa --- /dev/null +++ b/CPF.Toolkit.Demo/MainView.cs @@ -0,0 +1,68 @@ +using CPF; +using CPF.Animation; +using CPF.Charts; +using CPF.Controls; +using CPF.Drawing; +using CPF.Shapes; +using CPF.Styling; +using CPF.Svg; +using CPF.Toolkit.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace CPF.Toolkit.Demo +{ + public class MainView : Window + { + public MainView() + { + + } + protected override void InitializeComponent() + { + Title = "标题"; + Width = 500; + Height = 400; + Background = null; + var vm = new MainViewModel(); + this.DataContext = this.CommandContext = vm; + vm.Dialog = new DialogService(this); + + Children.Add(new WindowFrame(this, new WrapPanel + { + Orientation = Orientation.Horizontal, + Size = SizeField.Fill, + Children = + { + new Button + { + Content = "alert", + Commands = { { nameof(Button.Click),(s,e) => vm.Dialog.Alert("这是一条测试消息") } } + }, + new Button + { + Content = "Sucess", + Commands = { { nameof(Button.Click),(s,e) => vm.Dialog.Sucess("这是一条测试消息") } } + }, + new Button + { + Content = "Error", + Commands = { { nameof(Button.Click),(s,e) => vm.Dialog.Error("这是一条测试消息") } } + }, + new Button + { + Content = "Ask", + Commands = { { nameof(Button.Click),(s,e) => vm.Dialog.Ask("这是一条测试消息") } } + }, + new Button + { + Content = "Warn", + Commands = { { nameof(Button.Click),(s,e) => vm.Dialog.Warn("这是一条测试消息") } } + }, + } + })) ; + } + } +} diff --git a/CPF.Toolkit.Demo/MainViewModel.cs b/CPF.Toolkit.Demo/MainViewModel.cs new file mode 100644 index 0000000..26342a4 --- /dev/null +++ b/CPF.Toolkit.Demo/MainViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CPF.Toolkit.Demo +{ + internal class MainViewModel : ViewModelBase + { + + + } +} diff --git a/CPF.Toolkit.Demo/Program.cs b/CPF.Toolkit.Demo/Program.cs new file mode 100644 index 0000000..c0fb9fa --- /dev/null +++ b/CPF.Toolkit.Demo/Program.cs @@ -0,0 +1,20 @@ +using CPF.Platform; +using CPF.Skia; +using CPF.Windows; + +namespace CPF.Toolkit.Demo +{ + internal class Program + { + [STAThread] + static void Main(string[] args) + { + Application.Initialize( + (OperatingSystemType.Windows, new WindowsPlatform(false), new SkiaDrawingFactory { }) + , (OperatingSystemType.OSX, new CPF.Mac.MacPlatform(), new SkiaDrawingFactory { UseGPU = false }) + , (OperatingSystemType.Linux, new CPF.Linux.LinuxPlatform(), new SkiaDrawingFactory { UseGPU = false }) + ); + Application.Run(new MainView { }); + } + } +} diff --git a/CPF.Toolkit/CPF.Toolkit.csproj b/CPF.Toolkit/CPF.Toolkit.csproj new file mode 100644 index 0000000..a49aac9 --- /dev/null +++ b/CPF.Toolkit/CPF.Toolkit.csproj @@ -0,0 +1,25 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + + + + + + + + diff --git a/CPF.Toolkit/Dialogs/DialogFrame.cs b/CPF.Toolkit/Dialogs/DialogFrame.cs new file mode 100644 index 0000000..9b8d908 --- /dev/null +++ b/CPF.Toolkit/Dialogs/DialogFrame.cs @@ -0,0 +1,310 @@ +using CPF.Controls; +using CPF.Drawing; +using CPF.Shapes; +using CPF.Styling; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace CPF.Toolkit.Dialogs +{ + internal class DialogFrame : Control + { + public DialogFrame(IWindow window, UIElement content) + { + this.window = window; + this.content = content; + } + + /// + /// 是否显示最大化还原按钮 + /// + public bool MaximizeBox { get { return GetValue(); } set { SetValue(value); } } + /// + /// 是否显示最小化 + /// + [PropertyMetadata(true)] + public bool MinimizeBox { get { return GetValue(); } set { SetValue(value); } } + + IWindow window; + /// + /// 关联的窗体 + /// + [NotCpfProperty] + public IWindow Window + { + get { return window; } + } + + UIElement content; + /// + /// 窗体的内容 + /// + [NotCpfProperty] + public UIElement Content + { + get { return content; } + } + + IEnumerable systemButtons; + /// + /// 系统按钮集合 + /// + [NotCpfProperty] + public IEnumerable SystemButtons + { + get { return systemButtons; } + } + + /// + /// 阴影宽度 + /// + [Description("阴影宽度")] + [UIPropertyMetadata((byte)5, UIPropertyOptions.AffectsMeasure)] + public byte ShadowBlur + { + get { return GetValue(); } + set { SetValue(value); } + } + /// + /// 显示标题栏图标 + /// + [Description("显示标题栏图标"), PropertyMetadata(true)] + public bool ShowIcon + { + get { return GetValue(); } + set { SetValue(value); } + } + + protected override void InitializeComponent() + { + + ViewFill color = "black"; + ViewFill hoverColor = "255,255,255,40"; + Width = "100%"; + Height = "100%"; + //窗体阴影 + var frame = Children.Add(new Border + { + Name = "frame", + Width = "100%", + Height = "100%", + Background = "#fff", + BorderType = BorderType.BorderStroke, + BorderStroke = new Stroke(0), + ShadowBlur = ShadowBlur, + ShadowColor = Color.FromRgba(0, 0, 0, 150), + Bindings = + { + { + nameof(Border.ShadowBlur), + nameof(IWindow.WindowState), + window, + BindingMode.OneWay, + a => (WindowState)a == WindowState.Maximized||(WindowState)a == WindowState.FullScreen ? 0 : ShadowBlur + }, + { + nameof(Border.ShadowBlur), + nameof(ShadowBlur), + this, + BindingMode.OneWay, + a =>window.WindowState == WindowState.Maximized||window. WindowState == WindowState.FullScreen ? 0 : (byte)a + }, + } + }); + //用来裁剪内容,不然内容超出阴影 + var clip = new Decorator + { + Width = "100%", + Height = "100%", + ClipToBounds = true + }; + frame.Child = clip; + var grid = (Grid)(clip.Child = new Grid + { + Width = "100%", + Height = "100%", + ColumnDefinitions = + { + new ColumnDefinition() + }, + RowDefinitions = + { + new RowDefinition + { + Height = "auto" + }, + new RowDefinition + { + + } + }, + }); + //标题栏和按钮 + grid.Children.Add( + new Panel + { + Name = "caption", + Background = "white", + Width = "100%", + Height = "30", + Commands = + { + { + nameof(MouseDown), + nameof(IWindow.DragMove), + Window + }, + { + nameof(DoubleClick), + (s,e)=> DoubleClickTitle() + } + }, + Children = + { + new StackPanel + { + Name="titleBox", + MarginLeft=0, + Orientation= Orientation.Horizontal, + Children= + { + new Picture + { + Name="icon", + MarginLeft=5, + Width=20, + Height=20, + Stretch= Stretch.Fill, + Bindings= + { + { + nameof(Picture.Source), + nameof(window.Icon), + window + }, + { + nameof(Visibility), + nameof(window.Icon), + window, + BindingMode.OneWay, + a=>a==null||!ShowIcon?Visibility.Collapsed:Visibility.Visible + }, + { + nameof(Visibility), + nameof(ShowIcon), + this, + BindingMode.OneWay, + (bool showIcon)=>!showIcon||window.Icon==null?Visibility.Collapsed:Visibility.Visible + } + } + }, + new TextBlock + { + Name="title", + MarginLeft=8, + MarginTop=2, + FontSize = 14, + Foreground="Gray", + Bindings= + { + { + nameof(TextBlock.Text), + nameof(IWindow.Title), + Window + } + }, + }, + } + }, + new StackPanel + { + Name="controlBox", + MarginRight=0, + Height = "100%", + Orientation= Orientation.Horizontal, + Children = + { + new SystemButton + { + Name="close", + ToolTip="关闭", + Width = 30, + Height = "100%", + Content=new Panel{ + Size=SizeField.Fill, + Children = + { + new Line + { + MarginTop=8, + MarginLeft=8, + StartPoint = new Point(1, 1), + EndPoint = new Point(14, 13), + StrokeStyle = "2", + IsAntiAlias=true, + StrokeFill=color + }, + new Line + { + MarginTop=8, + MarginLeft=8, + StartPoint = new Point(14, 1), + EndPoint = new Point(1, 13), + StrokeStyle = "2", + IsAntiAlias=true, + StrokeFill=color + } + } + }, + Commands = + { + { + nameof(Button.Click), + (s,e)=> + { + //(e as MouseButtonEventArgs).Handled=true; + Window.Close(); + } + } + }, + Triggers= + { + new Trigger(nameof(Panel.IsMouseOver), Relation.Me) + { + Setters = + { + { + nameof(Panel.Background), + hoverColor + } + } + } + }, + } + } + } + } + }); + if (Content != null) + { + grid.Children.Add(Content, 0, 1); + } + } + + protected void DoubleClickTitle() + { + if (MaximizeBox) + { + this.Delay(TimeSpan.FromMilliseconds(100), () => + { + if (Window.WindowState == WindowState.Normal) + { Window.WindowState = WindowState.Maximized; } + else if (Window.WindowState == WindowState.Maximized) + { Window.WindowState = WindowState.Normal; } + }); + } + } + } +} diff --git a/CPF.Toolkit/Dialogs/DialogView.cs b/CPF.Toolkit/Dialogs/DialogView.cs new file mode 100644 index 0000000..1a5d476 --- /dev/null +++ b/CPF.Toolkit/Dialogs/DialogView.cs @@ -0,0 +1,158 @@ +using CPF; +using CPF.Animation; +using CPF.Charts; +using CPF.Controls; +using CPF.Drawing; +using CPF.Shapes; +using CPF.Styling; +using CPF.Svg; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace CPF.Toolkit.Dialogs +{ + public class DialogView : Window + { + public DialogView(string text, string title, DialogType dialogType, string defaultButton, params string[] buttons) + { + this.Title = title; + this.Text = text; + this.Buttons = buttons; + this.DefaultButton = defaultButton; + this.DialogType = dialogType; + } + + public DialogType DialogType { get => GetValue(); set => SetValue(value); } + public string DefaultButton { get => GetValue(); set => SetValue(value); } + public string Text { get => GetValue(); set => SetValue(value); } + public string[] Buttons { get => GetValue(); set => SetValue(value); } + protected override void InitializeComponent() + { + this.ShowInTaskbar = false; + this.MaxWidth = 800; + this.MinWidth = 400; + this.MaxHeight = 600; + this.MinHeight = 250; + this.CanResize = false; + this.Width = "auto"; + this.Height = "auto"; + this.Background = null; + this.Children.Add(new DialogFrame(this, new Grid + { + Size = SizeField.Fill, + RowDefinitions = + { + new RowDefinition{ Height = "auto" }, + new RowDefinition{ }, + new RowDefinition{ Height = 35 }, + }, + Children = + { + new Picture + { + Stretch = Stretch.None, + Bindings = + { + { + nameof(Visibility), + nameof(DialogType), + this,BindingMode.OneWay, + (DialogType t) => t == DialogType.None ? Visibility.Collapsed : Visibility.Visible + }, + { + nameof(Picture.Source), + nameof(DialogType), + this,BindingMode.OneWay, + (DialogType t) => + { + switch (t) + { + case DialogType.Sucess: return "res://CPF.Toolkit/Images/sucess.png"; + case DialogType.Error:return"res://CPF.Toolkit/Images/error.png"; + case DialogType.Ask: return"res://CPF.Toolkit/Images/ask.png"; + case DialogType.Warn:return "res://CPF.Toolkit/Images/warn.png"; + default:return null; + } + } + } + } + }, + new TextBox + { + Attacheds = { { Grid.RowIndex,1 } }, + BorderType = BorderType.BorderThickness, + BorderStroke = new Stroke(1, DashStyles.Solid), + BorderThickness = new Thickness(0,0,0,1), + //BorderFill = "Silver", + IsReadOnly = true, + Size = SizeField.Fill, + FontSize = 16, + WordWarp = true, + TextAlignment = TextAlignment.Center, + Bindings = + { + { nameof(TextBox.Text),nameof(Text),this,BindingMode.OneWay} + } + }.Assign(out var textBox), + //new Border + //{ + // Attacheds = { { Grid.RowIndex,2 } }, + // BorderThickness = new Thickness(0,1,0,0), + // BorderType = BorderType.BorderThickness, + // BorderFill = "236,236,236", + // Size = SizeField.Fill, + // MarginBottom = 5, + //}, + new StackPanel + { + Height = "100%", + Attacheds = { { Grid.RowIndex,2 } }, + MarginBottom = 4, + Orientation = Orientation.Horizontal, + }.Assign(out var p), + } + })); + + this.Buttons.Select(x => new Button + { + Content = x, + MinWidth = this.Buttons.Length <= 1 ? 80 : 65, + Background = "white", + BorderFill = "236,236,236", + Height = "95%", + MarginRight = 5, + }).ToList().ForEach(c => + { + p.Children.Add(c); + c.Click += C_Click; + if (c.Content.ToString() == this.DefaultButton) + { + c.Focus(); + } + }); + textBox.TextChanged += TextBox_TextChanged; + } + + private void TextBox_TextChanged(object sender, EventArgs e) + { + var textBox = sender as TextBox; + if (textBox.Document.Lines.Count > 5) + { + textBox.TextAlignment = TextAlignment.Left; + textBox.Height = "100%"; + } + else + { + textBox.TextAlignment = TextAlignment.Center; + textBox.Height = "auto"; + } + } + + private void C_Click(object sender, RoutedEventArgs e) + { + this.DialogResult = (sender as Button).Content; + } + } +} diff --git a/CPF.Toolkit/Dialogs/IDialogService.cs b/CPF.Toolkit/Dialogs/IDialogService.cs new file mode 100644 index 0000000..c4263f9 --- /dev/null +++ b/CPF.Toolkit/Dialogs/IDialogService.cs @@ -0,0 +1,68 @@ +using CPF.Controls; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CPF.Toolkit.Dialogs +{ + public interface IDialogService + { + string Alert(string text, string title, DialogType dialogType, string defaultButton, params string[] buttons); + void Alert(string text); + void Sucess(string text); + void Error(string text); + void Warn(string text); + string Ask(string text); + } + + public class DialogService : IDialogService + { + public DialogService(Window owner) + { + this.owner = owner; + } + Window owner; + + public string Alert(string text, string title, DialogType dialogType, string defaultButton, params string[] buttons) + { + var view = new DialogView(text, title, dialogType, defaultButton, buttons); + view.MarginLeft = this.owner.MarginLeft.Value - this.owner.Width.Value / 2; + view.MarginTop = this.owner.MarginTop.Value - this.owner.Height.Value / 2; + return view.ShowDialogSync(this.owner)?.ToString(); + } + + public void Alert(string text) + { + this.Alert(text, "消息", DialogType.None, "确定", "确定"); + } + + public string Ask(string text) + { + return this.Alert(text, "询问", DialogType.Ask, "确定", "确定", "取消"); + } + + public void Error(string text) + { + this.Alert(text, "错误", DialogType.Error, defaultButton: "确定", "确定"); + } + + public void Sucess(string text) + { + this.Alert(text, "成功", DialogType.Sucess, "确定", "确定"); + } + + public void Warn(string text) + { + this.Alert(text, "警告", DialogType.Warn, "确定", "确定"); + } + } + + public enum DialogType + { + None, + Sucess, + Error, + Ask, + Warn + } +} diff --git a/CPF.Toolkit/Images/ask.png b/CPF.Toolkit/Images/ask.png new file mode 100644 index 0000000..ba96970 Binary files /dev/null and b/CPF.Toolkit/Images/ask.png differ diff --git a/CPF.Toolkit/Images/error.png b/CPF.Toolkit/Images/error.png new file mode 100644 index 0000000..8517c9c Binary files /dev/null and b/CPF.Toolkit/Images/error.png differ diff --git a/CPF.Toolkit/Images/sucess.png b/CPF.Toolkit/Images/sucess.png new file mode 100644 index 0000000..43c4cce Binary files /dev/null and b/CPF.Toolkit/Images/sucess.png differ diff --git a/CPF.Toolkit/Images/warn.png b/CPF.Toolkit/Images/warn.png new file mode 100644 index 0000000..74abcc4 Binary files /dev/null and b/CPF.Toolkit/Images/warn.png differ diff --git a/CPF.Toolkit/ObservableObject.cs b/CPF.Toolkit/ObservableObject.cs new file mode 100644 index 0000000..9e79623 --- /dev/null +++ b/CPF.Toolkit/ObservableObject.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Text; + +namespace CPF.Toolkit +{ + public class ObservableObject : INotifyPropertyChanged + { + readonly ConcurrentDictionary Propertys = new ConcurrentDictionary { }; + public event PropertyChangedEventHandler PropertyChanged; + + + public T GetValue(T defaultValue = default, [CallerMemberName] string propertyName = null) + { + if (string.IsNullOrEmpty(propertyName)) + { + throw new Exception("propertyName不能为空"); + } + if (!this.Propertys.ContainsKey(propertyName)) + { + this.Propertys.TryAdd(propertyName, defaultValue); + } + return (T)this.Propertys[propertyName]; + } + + public bool SetValue(T value, [CallerMemberName] string propertyName = null) + { + if (string.IsNullOrEmpty(propertyName)) + { + throw new Exception("propertyName不能为空"); + } + + if (!this.Propertys.ContainsKey(propertyName)) + { + this.Propertys.TryAdd(propertyName, value); + } + else + { + var v = this.GetValue(propertyName: propertyName); + if (EqualityComparer.Default.Equals(value, v)) return false; + this.Propertys[propertyName] = value; + } + this.RaisePropertyChanged(propertyName); + return true; + } + + public void SetValue(T value, Action action, [CallerMemberName] string propertyName = null) + { + if (this.SetValue(value, propertyName)) + { + action.Invoke(value); + } + } + + protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} diff --git a/CPF.Toolkit/ViewModelBase.cs b/CPF.Toolkit/ViewModelBase.cs new file mode 100644 index 0000000..6828dd8 --- /dev/null +++ b/CPF.Toolkit/ViewModelBase.cs @@ -0,0 +1,12 @@ +using CPF.Toolkit.Dialogs; +using System; +using System.Collections.Generic; +using System.Text; + +namespace CPF.Toolkit +{ + public class ViewModelBase : ObservableObject + { + public IDialogService Dialog { get; set; } + } +} diff --git a/ConsoleApp1.sln b/ConsoleApp1.sln index 1901bb3..4269b1e 100644 --- a/ConsoleApp1.sln +++ b/ConsoleApp1.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29324.140 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34316.72 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{ABE4ED47-CB9F-4183-9CE3-65E3E521BE2A}" EndProject @@ -59,12 +59,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CPF.Demo", "CPF_Demo\CPF.De EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "蓝图重制版", "蓝图重制版\蓝图重制版.csproj", "{003E155A-8C40-41AF-A796-ED17E729E013}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Toolkit", "Toolkit", "{28FB518C-2103-4772-A245-C5F1D40E1EF5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPF.Toolkit", "CPF.Toolkit\CPF.Toolkit.csproj", "{09C160EB-D2C3-42E5-82B3-7047CF87CE6C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPF.Toolkit.Demo", "CPF.Toolkit.Demo\CPF.Toolkit.Demo.csproj", "{AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - Private\SharedVSIX\SharedVSIX.projitems*{db53e8d7-dfb6-48eb-a7b6-d1cf762acb9b}*SharedItemsImports = 4 - Private\SharedVSIX\SharedVSIX.projitems*{df526631-d060-47f2-afd4-62c6cea2fe9a}*SharedItemsImports = 4 - Private\SharedVSIX\SharedVSIX.projitems*{f34cffee-546f-490e-a76a-2792840b284d}*SharedItemsImports = 13 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU @@ -224,6 +225,18 @@ Global {003E155A-8C40-41AF-A796-ED17E729E013}.Release|Any CPU.Build.0 = Release|Any CPU {003E155A-8C40-41AF-A796-ED17E729E013}.类库d|Any CPU.ActiveCfg = 类库d|Any CPU {003E155A-8C40-41AF-A796-ED17E729E013}.类库d|Any CPU.Build.0 = 类库d|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.Release|Any CPU.Build.0 = Release|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.类库d|Any CPU.ActiveCfg = Debug|Any CPU + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C}.类库d|Any CPU.Build.0 = Debug|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.Release|Any CPU.Build.0 = Release|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.类库d|Any CPU.ActiveCfg = Debug|Any CPU + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF}.类库d|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -240,5 +253,15 @@ Global {1278A1BC-327D-4D13-AD04-C6FF2B680530} = {2B729C46-7592-425A-87E9-D769A94881F7} {F34CFFEE-546F-490E-A76A-2792840B284D} = {2B729C46-7592-425A-87E9-D769A94881F7} {DF526631-D060-47F2-AFD4-62C6CEA2FE9A} = {2B729C46-7592-425A-87E9-D769A94881F7} + {09C160EB-D2C3-42E5-82B3-7047CF87CE6C} = {28FB518C-2103-4772-A245-C5F1D40E1EF5} + {AEA7FF33-1621-4A0A-9C08-6C4CB10C76FF} = {28FB518C-2103-4772-A245-C5F1D40E1EF5} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E38AA5AA-8B93-40BD-8A5E-2E0D1538EB8D} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Private\SharedVSIX\SharedVSIX.projitems*{db53e8d7-dfb6-48eb-a7b6-d1cf762acb9b}*SharedItemsImports = 4 + Private\SharedVSIX\SharedVSIX.projitems*{df526631-d060-47f2-afd4-62c6cea2fe9a}*SharedItemsImports = 4 + Private\SharedVSIX\SharedVSIX.projitems*{f34cffee-546f-490e-a76a-2792840b284d}*SharedItemsImports = 13 EndGlobalSection EndGlobal