using HandyControl.Controls;
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using WPFProject.Models;
using WPFProject.UI.Test;
using WPFProject.Utils;
using static WPFProject.Utils.Resize.Resizeable;
namespace WPFProject.Controls
{
///
/// 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 => VisualTreeHelper.GetChild(this, 0) 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(ProgramList),
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(ProgramList),
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
}
}