From db457dac7bcb78469d1777484145b444618b5a48 Mon Sep 17 00:00:00 2001 From: luxiaoqi Date: Fri, 24 Nov 2023 17:31:24 +0800 Subject: [PATCH] mdi --- CPF.Toolkit.Demo/TestMdiView.cs | 24 ++-- CPF.Toolkit/Controls/MdiFrame.cs | 223 ------------------------------ CPF.Toolkit/Controls/MdiHost.cs | 44 ++++++ CPF.Toolkit/Controls/MdiWindow.cs | 172 ++++++++++++++++------- 4 files changed, 174 insertions(+), 289 deletions(-) delete mode 100644 CPF.Toolkit/Controls/MdiFrame.cs create mode 100644 CPF.Toolkit/Controls/MdiHost.cs diff --git a/CPF.Toolkit.Demo/TestMdiView.cs b/CPF.Toolkit.Demo/TestMdiView.cs index 364e549..20e8c2d 100644 --- a/CPF.Toolkit.Demo/TestMdiView.cs +++ b/CPF.Toolkit.Demo/TestMdiView.cs @@ -23,25 +23,23 @@ namespace CPF.Toolkit.Demo this.Width = 1280; this.Height = 720; this.Background = null; - var frame = this.Children.Add(new WindowFrame(this, new Panel + var frame = this.Children.Add(new WindowFrame(this, new MdiHost { - Size = SizeField.Fill, - Background = "204,204,204", Children = { new MdiWindow { Title = "test", - //Content = new WrapPanel - //{ - // Children = - // { - // new Button{ Content = "test" ,Width = 100, Height = 35 }, - // new Button{ Content = "test" ,Width = 100, Height = 35 }, - // new Button{ Content = "test" ,Width = 100, Height = 35 }, - // new Button{ Content = "test" ,Width = 100, Height = 35 }, - // }, - //}, + Content = new WrapPanel + { + Children = + { + new Button{ Content = "test" ,Width = 100, Height = 35 }, + new Button{ Content = "test" ,Width = 100, Height = 35 }, + new Button{ Content = "test" ,Width = 100, Height = 35 }, + new Button{ Content = "test" ,Width = 100, Height = 35 }, + }, + }, } } })); diff --git a/CPF.Toolkit/Controls/MdiFrame.cs b/CPF.Toolkit/Controls/MdiFrame.cs deleted file mode 100644 index 8d46bd0..0000000 --- a/CPF.Toolkit/Controls/MdiFrame.cs +++ /dev/null @@ -1,223 +0,0 @@ -using CPF.Controls; -using CPF.Drawing; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CPF.Toolkit.Controls -{ - internal class MdiFrame : Control - { - public MdiFrame() - { - - } - - protected override void InitializeComponent() - { - this.Children.Add(new Grid - { - Size = SizeField.Fill, - RowDefinitions = - { - new RowDefinition{ Height = 35 }, - new RowDefinition{ }, - }, - Children = - { - new Thumb - { - Size = SizeField.Fill, - Background = new LinearGradientFill - { - EndPoint = "0,100%", - GradientStops = - { - new GradientStop("152,180,208",0), - new GradientStop("181,206,231",1), - } - }, - Child = new Panel - { - Size = SizeField.Fill, - Children = - { - new StackPanel - { - Orientation = Orientation.Horizontal, - MarginLeft = 0, - Children = - { - new TextBlock - { - [nameof(TextBlock.Text)] = new BindingDescribe(this,nameof(this.Title),BindingMode.OneWay), - FontSize = 14, - MarginLeft = 10, - }, - } - }, - new StackPanel - { - Orientation = Orientation.Horizontal, - MarginRight = 0, - Height = "100%", - Children = - { - new SystemButton - { - Name = "min", - Size = new SizeField(30,"100%"), - Content = new Line - { - MarginTop = 5, - MarginLeft = "auto", - StartPoint = new Point(1,13), - EndPoint = new Point(14,13), - StrokeStyle = "2", - IsAntiAlias = true, - StrokeFill = "black" - } - }, - new Panel - { - Height = "100%", - Bindings = - { - { - nameof(Visibility), - nameof(MaximizeBox), - this, - BindingMode.OneWay, - a => (bool)a ? Visibility.Visible : Visibility.Collapsed - } - }, - Children = - { - new SystemButton - { - Name = "max", - Size = new SizeField(30,"100%"), - Content = new Rectangle - { - Size = new SizeField(14,12), - MarginTop = 10, - StrokeStyle = "2", - }, - Commands = - { - { nameof(Button.Click),(s,e) => this.WindowState = WindowState.Maximized } - }, - Bindings = - { - { - nameof(Border.Visibility), - nameof(this.WindowState), - this, - BindingMode.OneWay, - a => (WindowState)a == WindowState.Maximized || (WindowState)a == WindowState.FullScreen ? Visibility.Collapsed : Visibility.Visible - } - } - }, - new SystemButton - { - Name = "nor", - Visibility = Visibility.Collapsed, - Size = new SizeField(30,"100%"), - Content = new Panel - { - Size = SizeField.Fill, - Children = - { - new Rectangle - { - MarginTop = 15, - MarginLeft =8, - Size = new SizeField(11,8), - StrokeStyle = "1.5", - }, - new Polyline - { - MarginTop =11, - MarginLeft = 12, - Points = - { - new Point(0,3), - new Point(0,0), - new Point(9,0), - new Point(9,7), - new Point(6,7) - }, - StrokeStyle = "2" - } - } - }, - Commands = - { - { nameof(Button.Click),(s,e) => this.WindowState = WindowState.Normal } - }, - Bindings = - { - { - nameof(Border.Visibility), - nameof(Window.WindowState), - this, - BindingMode.OneWay, - a => (WindowState)a == WindowState.Normal ? Visibility.Collapsed : Visibility.Visible - } - } - } - } - }, - new SystemButton - { - Name = "close", - Size = new SizeField(30,"100%"), - Content = new Panel - { - Size = SizeField.Fill, - Children = - { - new Line - { - MarginTop=10, - MarginLeft=8, - StartPoint = new Point(1, 1), - EndPoint = new Point(14, 13), - StrokeStyle = "2", - IsAntiAlias=true, - }, - new Line - { - MarginTop=10, - MarginLeft=8, - StartPoint = new Point(14, 1), - EndPoint = new Point(1, 13), - StrokeStyle = "2", - IsAntiAlias=true, - } - } - }, - } - } - }, - }, - }, - }.Assign(out var thumb), - new Panel - { - Attacheds = { { Grid.RowIndex,1 } }, - BorderFill = "186,210,234", - BorderType = BorderType.BorderThickness, - BorderThickness = new Thickness(5,0,5,5), - Size = SizeField.Fill, - Children = - { - - }, - }, - } - }); - - } - } -} diff --git a/CPF.Toolkit/Controls/MdiHost.cs b/CPF.Toolkit/Controls/MdiHost.cs new file mode 100644 index 0000000..a14d705 --- /dev/null +++ b/CPF.Toolkit/Controls/MdiHost.cs @@ -0,0 +1,44 @@ +using CPF.Controls; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace CPF.Toolkit.Controls +{ + public class MdiHost : Panel + { + public MdiHost() + { + Size = SizeField.Fill; + Background = "204,204,204"; + } + + protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue, PropertyMetadataAttribute propertyMetadata) + { + if (propertyName == nameof(ActualSize)) + { + foreach (MdiWindow item in this.Children) + { + if (item.WindowState == WindowState.Maximized) continue; + + if (item.MarginLeft.Value + item.ActualSize.Width > this.ActualSize.Width) + { + item.MarginLeft = this.ActualSize.Width - item.ActualSize.Width; + } + + if (item.MarginTop.Value + item.ActualSize.Height > this.ActualSize.Height) + { + item.MarginTop = this.ActualSize.Height - item.ActualSize.Height; + } + } + } + base.OnPropertyChanged(propertyName, oldValue, newValue, propertyMetadata); + } + + protected override void OnUIElementAdded(UIElementAddedEventArgs e) + { + base.OnUIElementAdded(e); + } + } +} diff --git a/CPF.Toolkit/Controls/MdiWindow.cs b/CPF.Toolkit/Controls/MdiWindow.cs index f3930a1..bb4f586 100644 --- a/CPF.Toolkit/Controls/MdiWindow.cs +++ b/CPF.Toolkit/Controls/MdiWindow.cs @@ -32,34 +32,101 @@ namespace CPF.Toolkit.Controls Point normalPos = new Point(0, 0); protected override void InitializeComponent() { + var bar = (ViewFill)"154,180,208"; this.Size = normalSize; this.Background = "white"; - this.BorderFill = "179,179,179"; - this.BorderStroke = "1"; this.MarginLeft = 0; this.MarginTop = 0; + this.MinWidth = 150; + this.MinHeight = 50; + this.ClipToBounds = true; base.Children.Add(new Grid { Size = SizeField.Fill, + ColumnDefinitions = + { + new ColumnDefinition{ Width = "auto" }, + new ColumnDefinition{ }, + new ColumnDefinition{ Width = "auto" }, + }, RowDefinitions = { - new RowDefinition{ Height = 35 }, - new RowDefinition{ }, + new RowDefinition{ Height = "auto" }, + new RowDefinition{ Height = 30 }, + new RowDefinition{ }, + new RowDefinition{ Height = "auto" }, }, Children = { new Thumb { - Size = SizeField.Fill, - Background = new LinearGradientFill + Name = "top", + Size = "100%,5", + Background = bar, + Cursor = Cursors.SizeNorthSouth, + Attacheds = { { Grid.ColumnSpan,3 } }, + Commands = { - EndPoint = "0,100%", - GradientStops = { - new GradientStop("152,180,208",0), - new GradientStop("181,206,231",1), + nameof(Thumb.DragDelta),(s,e) => + { + var args = e as DragDeltaEventArgs; + if (this.Height.Value - args.VerticalChange > 0) + { + this.MarginTop += args.VerticalChange; + this.Height -= args.VerticalChange; + } + } } - }, + } + }, + new Thumb + { + Name = "left", + Size = "5,100%", + Background = bar, + Cursor = Cursors.SizeWestEast, + Attacheds = { { Grid.ColumnIndex,0 } ,{ Grid.RowSpan,4 } }, + Commands = + { + { + nameof(Thumb.DragDelta),(s,e) => + { + var args = e as DragDeltaEventArgs; + if (this.Width.Value - args.HorizontalChange > 0) + { + this.MarginLeft += args.HorizontalChange; + this.Width -= args.HorizontalChange; + } + } + } + } + }, + new Thumb + { + Name = "right", + Size = "5,100%", + Background = bar, + Cursor = Cursors.SizeWestEast, + MarginRight = 0, + Attacheds = { { Grid.ColumnIndex,2 },{ Grid.RowSpan,4 } }, + Commands = { { nameof(Thumb.DragDelta),(s,e) => this.Width += (e as DragDeltaEventArgs).HorizontalChange } } + }, + new Thumb + { + Name = "bottom", + Size = "100%,5", + Background = bar, + Cursor = Cursors.SizeNorthSouth, + Attacheds = { { Grid.RowIndex,3 },{ Grid.ColumnSpan,3 } }, + Commands = { { nameof(Thumb.DragDelta),(s,e) => this.Height += (e as DragDeltaEventArgs).VerticalChange } } + }, + new Thumb + { + Name = "caption", + Attacheds = { { Grid.RowIndex,1 },{ Grid.ColumnIndex,1 } }, + Size = SizeField.Fill, + Background = bar, Child = new Panel { Size = SizeField.Fill, @@ -92,7 +159,7 @@ namespace CPF.Toolkit.Controls Size = new SizeField(30,"100%"), Content = new Line { - MarginTop = 5, + //MarginTop = 5, MarginLeft = "auto", StartPoint = new Point(1,13), EndPoint = new Point(14,13), @@ -123,7 +190,7 @@ namespace CPF.Toolkit.Controls Content = new Rectangle { Size = new SizeField(14,12), - MarginTop = 10, + MarginTop = 5, StrokeStyle = "2", }, Commands = @@ -153,14 +220,14 @@ namespace CPF.Toolkit.Controls { new Rectangle { - MarginTop = 15, + MarginTop = 10, MarginLeft =8, Size = new SizeField(11,8), StrokeStyle = "1.5", }, new Polyline { - MarginTop =11, + MarginTop =5, MarginLeft = 12, Points = { @@ -202,7 +269,7 @@ namespace CPF.Toolkit.Controls { new Line { - MarginTop=10, + MarginTop=4, MarginLeft=8, StartPoint = new Point(1, 1), EndPoint = new Point(14, 13), @@ -211,7 +278,7 @@ namespace CPF.Toolkit.Controls }, new Line { - MarginTop=10, + MarginTop=4, MarginLeft=8, StartPoint = new Point(14, 1), EndPoint = new Point(1, 13), @@ -225,33 +292,45 @@ namespace CPF.Toolkit.Controls }, }, }, - }.Assign(out var thumb), - new Panel - { - Attacheds = { { Grid.RowIndex,1 } }, - BorderFill = "186,210,234", - BorderType = BorderType.BorderThickness, - BorderThickness = new Thickness(5,0,5,5), - Size = SizeField.Fill, - Children = + Commands = { - + { + nameof(Thumb.DragDelta), + (s,e) => + { + if (this.WindowState == WindowState.Maximized) return; + var arge = e as DragDeltaEventArgs; + this.MarginLeft += arge.HorizontalChange; + this.MarginTop += arge.VerticalChange; + this.normalPos = new Point(this.MarginLeft.Value, this.MarginTop.Value); + } + }, + { + nameof(DoubleClick), + (s,e) => this.Delay(TimeSpan.FromMilliseconds(150),() => + { + if (this.WindowState.Or(WindowState.Maximized,WindowState.Minimized)) + { + this.WindowState = WindowState.Normal; + } + else if (this.WindowState == WindowState.Normal) + { + this.WindowState = WindowState.Maximized; + } + }) + } }, }, + new Decorator + { + Attacheds = { { Grid.RowIndex,2 } ,{ Grid.ColumnIndex,1 } }, + Size = SizeField.Fill, + Child = this.Content, + }, } }); - thumb.DragDelta += Thumb_DragDelta; - } - - private void Thumb_DragDelta(object sender, DragDeltaEventArgs e) - { - if (this.WindowState == WindowState.Maximized) - { - return; - } - this.MarginLeft += e.HorizontalChange; - this.MarginTop += e.VerticalChange; - this.normalPos = new Point(this.MarginLeft.Value, this.MarginTop.Value); + this.Content.Margin = "0"; + this.Content.ClipToBounds = true; } protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue, PropertyMetadataAttribute propertyMetadata) @@ -283,6 +362,7 @@ namespace CPF.Toolkit.Controls case nameof(Size): case nameof(Width): case nameof(Height): + case nameof(ActualSize): if (this.WindowState == WindowState.Normal) { this.normalSize = this.Size; @@ -295,11 +375,6 @@ namespace CPF.Toolkit.Controls { this.MarginLeft = 0; } - else - { - var value = this.MarginLeft.Value + this.Width.Value; - Debug.WriteLine(value); - } } break; case nameof(MarginTop): @@ -308,15 +383,6 @@ namespace CPF.Toolkit.Controls this.MarginTop = 0; } break; - //case nameof(MarginRight): - // if (MarginRight.Value <= 0) - // { - // this.MarginRight = 0; - // } - // break; - //case nameof(MarginBottom): - - // break; } base.OnPropertyChanged(propertyName, oldValue, newValue, propertyMetadata);