using Plugin.TestBuilder.Entity; using System; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; namespace Plugin.TestBuilder.UI { /// /// InnerWindow.xaml 的交互逻辑 /// public partial class InnerWindow : UserControl, INotifyPropertyChanged { #region INotifyPropertyChanged public virtual event PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyChanged(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } protected void RaiseAndSetIfChanged(ref T old, T @new, [CallerMemberName] string propertyName = null) { old = @new; if (propertyName != null) { RaisePropertyChanged(propertyName); } } #endregion #region 属性 #region Common public DragType DragType { get; set; } = DragType.Canvas; public CanvasPosition canvasPosition; private Canvas canvas; public WindowState WindowState { get; set; } = WindowState.Normal; public AdornerDecorator ResizeAdornerDecorator { get { return this.Template.FindName("PART_Adorner", this) as AdornerDecorator; } } private string _Title; public string Title { get { return _Title; } set => RaiseAndSetIfChanged(ref _Title, value); } public int Zindex { get { return Canvas.GetZIndex(this); } set { Canvas.SetZIndex(this, value); } } #endregion #region 事件 public event EventHandler MinEvent; public event EventHandler MaxEvent; public event EventHandler CloseEvent; public event EventHandler ZIndexEvent; #endregion #region DependencyProperty public Brush HeaderBackground { get { return (Brush)GetValue(HeaderBackgroundProperty); } set { SetValue(HeaderBackgroundProperty, value); } } public static readonly DependencyProperty HeaderBackgroundProperty = DependencyProperty.Register("HeaderBackground", typeof(Brush), typeof(InnerWindow), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(54, 146, 225)))); public Brush HeaderFontColor { get { return (Brush)GetValue(HeaderFontColorProperty); } set { SetValue(HeaderFontColorProperty, value); } } public static readonly DependencyProperty HeaderFontColorProperty = DependencyProperty.Register("HeaderFontColor", typeof(Brush), typeof(InnerWindow), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(255, 255, 225)))); #endregion #endregion public InnerWindow() : this(null) { } public InnerWindow(CanvasPosition canvasPosition) { this.canvasPosition = canvasPosition; if (canvasPosition != null) { Width = canvasPosition.Width; Height = canvasPosition.Height; } DataContext = this; InitializeComponent(); Loaded += InnerWindow_Loaded; } private void InnerWindow_Loaded(object sender, RoutedEventArgs e) { if (canvasPosition == null) { canvasPosition = new CanvasPosition { Left = Canvas.GetLeft(this), Top = Canvas.GetTop(this), Width = ActualWidth, Height = ActualHeight }; } Loaded -= InnerWindow_Loaded; } #region 拖拽移动相关 private void DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { switch (DragType) { case DragType.Canvas: { double offsetX = e.HorizontalChange; double offsetY = e.VerticalChange; Width = ActualWidth > canvas.ActualWidth ? canvas.ActualWidth : Width; Height = ActualHeight > canvas.ActualHeight ? canvas.ActualHeight : Height; double newLeft = Canvas.GetLeft(this) + e.HorizontalChange; newLeft = newLeft < 0 ? 0 : newLeft; double newTop = Canvas.GetTop(this) + e.VerticalChange; newTop = newTop < 0 ? 0 : newTop; double fixLeft = canvasPosition == null || canvasPosition.LimitWidth <= 0 ? ActualWidth : canvasPosition.LimitWidth; double fixTop = canvasPosition == null || canvasPosition.LimitHeight <= 0 ? ActualHeight : canvasPosition.LimitHeight; if (canvas != null) { newLeft = offsetX > 0 && newLeft > canvas.ActualWidth - fixLeft ? canvas.ActualWidth - fixLeft : newLeft; newTop = offsetY > 0 && newTop > canvas.ActualHeight - fixTop ? canvas.ActualHeight - fixTop : newTop; } Canvas.SetLeft(this, newLeft); Canvas.SetTop(this, newTop); break; } } } private void DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e) { ZIndexEvent?.Invoke(this, null); // thumb1.Background = Brushes.White; } private void DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) { canvasPosition.Top = Canvas.GetTop(this); canvasPosition.Left = Canvas.GetLeft(this); } #endregion /// /// 添加到画布上 /// /// public void AttachToCanvas(Canvas canvas) { if (true) { Resize.SetIsResizeable(this, true); } canvas.Children.Add(this); this.canvas = canvas; if (ActualWidth < MinWidth) { Width = MinWidth; } if (ActualHeight < MinHeight) { Height = MinHeight; } Canvas.SetLeft(this, canvasPosition == null ? 0 : canvasPosition.Left); Canvas.SetTop(this, canvasPosition == null ? 0 : canvasPosition.Top); canvas.SizeChanged += Canvas_SizeChanged; } private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e) { Size newSize = e.NewSize; Size previousSize = e.PreviousSize; double xRate = newSize.Width / previousSize.Width; double yRate = newSize.Height / previousSize.Height; Canvas.SetLeft(this, Canvas.GetLeft(this) * xRate); Canvas.SetTop(this, Canvas.GetTop(this) * yRate); this.Width = this.Width * xRate; this.Height = this.Height * yRate; } private void Min_Click(object sender, RoutedEventArgs e) { MinEvent?.Invoke(this, null); } private void Max_Click(object sender, RoutedEventArgs e) { MaxEvent?.Invoke(this, null); } private void CLose_Click(object sender, RoutedEventArgs e) { } private void Grid_GotFocus(object sender, RoutedEventArgs e) { } private void Grid_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { this.Focus(); } private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { } } public enum DragType { Canvas = 0, Dock = 1 } }