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
|
{
|
/// <summary>
|
/// InnerWindow.xaml 的交互逻辑
|
/// </summary>
|
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<T>(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
|
|
/// <summary>
|
/// 添加到画布上
|
/// </summary>
|
/// <param name="canvas"></param>
|
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
|
}
|
|
}
|