using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace PDF_Office.CustomControl
{
///
/// ColorDropBox.xaml 的交互逻辑
///
public partial class ColorDropBox : UserControl, INotifyPropertyChanged
{
public class AdornerPresenter : Adorner
{
private VisualCollection VisualChildren;
private ContentPresenter Content;
public AdornerPresenter(UIElement adornedElement) : base(adornedElement)
{
VisualChildren = new VisualCollection(this);
Content = new ContentPresenter();
VisualChildren.Add(Content);
}
protected override Size MeasureOverride(Size constraint)
{
Content.Measure(constraint);
return Content.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
Content.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
return Content.RenderSize;
}
protected override Visual GetVisualChild(int index)
{
return VisualChildren[index];
}
protected override int VisualChildrenCount
{
get
{
return VisualChildren.Count;
}
}
public object VisualContent
{
get
{
return Content.Content;
}
set
{
Content.Content = value;
}
}
}
private AdornerLayer popLayer;
private AdornerPresenter layerPresent;
private bool layerAdded = false;
private Canvas popCanvas;
private ColorDropBoxPop colorPop;
public event EventHandler SelectedColorChanged;
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private Color? _selectedColor;
public Color? SelectedColor
{
get
{
return _selectedColor;
}
set
{
if (_selectedColor != value)
{
_selectedColor = value;
OnPropertyChanged("SelectedColor");
}
}
}
public bool HasTransparentColor
{
get
{
if (colorPop != null)
{
return colorPop.TransparentPanel.Visibility == Visibility.Visible;
}
return false;
}
set
{
if (colorPop != null)
{
colorPop.SetTransparentPanelVisible(value);
}
}
}
public ColorDropBox()
{
InitializeComponent();
Loaded += ColorDropBox_Loaded;
Unloaded += ColorDropBox_Unloaded;
MouseDown += ColorDropBox_MouseDown;
colorPop = new ColorDropBoxPop();
}
private void ColorDropBox_Unloaded(object sender, RoutedEventArgs e)
{
if (layerAdded)
{
RemoveFromLayer();
return;
}
}
private void ColorDropBox_MouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
ShowLayer();
}
public void ShowLayer(DependencyObject dependencyObject = null)
{
if (layerAdded)
{
RemoveFromLayer();
return;
}
AddToLayer(dependencyObject);
}
private void AddToLayer(DependencyObject dependencyObject = null)
{
Window parentWnd = Window.GetWindow(this);
popLayer = AdornerLayer.GetAdornerLayer(parentWnd.Content as UIElement);
if (popLayer != null && colorPop != null &&!layerAdded)
{
if (layerPresent == null)
{
layerPresent = new AdornerPresenter(popLayer);
}
popLayer.Add(layerPresent);
if (popCanvas == null)
{
popCanvas = new Canvas();
popCanvas.Children.Add(colorPop);
layerPresent.VisualContent = popCanvas;
colorPop.ColorSelected += ColorPop_ColorSelected;
}
Point offset = GetOffsetToWindow(dependencyObject);
colorPop.Visibility = Visibility.Visible;
colorPop.Measure(new Size(parentWnd.ActualWidth, parentWnd.ActualHeight));
colorPop.SetValue(Canvas.TopProperty, offset.Y + this.ActualHeight + 2);
if (offset.X + colorPop.DesiredSize.Width + SystemParameters.ResizeFrameVerticalBorderWidth * 2 > parentWnd.ActualWidth)
{
colorPop.SetValue(Canvas.LeftProperty, parentWnd.ActualWidth - colorPop.DesiredSize.Width - 5 - SystemParameters.ResizeFrameVerticalBorderWidth * 2);
}
else
{
colorPop.SetValue(Canvas.LeftProperty, offset.X);
}
layerAdded = true;
}
}
private void RemoveFromLayer()
{
if (popLayer != null && layerPresent != null && layerAdded)
{
popLayer.Remove(layerPresent);
layerAdded = false;
}
}
private void ColorDropBox_Loaded(object sender, RoutedEventArgs e)
{
if (popLayer == null)
{
Window parentWnd = Window.GetWindow(this);
if (parentWnd != null && parentWnd.Content is UIElement && colorPop != null)
{
parentWnd.AddHandler(MouseDownEvent, new MouseButtonEventHandler((eventsender, param) =>
{
if (layerAdded)
{
try
{
Window checkWindow = Window.GetWindow(this);
Point clickPoint = param.GetPosition(checkWindow);
Point leftTop = TransformToVisual(checkWindow).Transform(new Point(0, 0));
Point rightBottom = TransformToVisual(checkWindow).Transform(new Point(ActualWidth, ActualHeight));
Point popLeftTop = new Point(Canvas.GetLeft(colorPop), Canvas.GetTop(colorPop));
Point popRightBottom = new Point(colorPop.ActualWidth, colorPop.ActualHeight);
Rect dropboxRect = new Rect(leftTop.X, leftTop.Y, rightBottom.X - leftTop.X, rightBottom.Y - leftTop.Y);
Rect popboxRect = new Rect(popLeftTop.X, popLeftTop.Y, popRightBottom.X, popRightBottom.Y);
if (dropboxRect.Contains(clickPoint) || popboxRect.Contains(clickPoint))
{
return;
}
RemoveFromLayer();
}
catch(Exception ex)
{
}
}
}), true);
}
}
}
private void ColorPop_ColorSelected(object sender, Color e)
{
if (SelectedColor != e)
{
// NormalColorRectControl.Visibility = Visibility.Collapsed;
// TransparentRectControl.Visibility = Visibility.Collapsed;
if (e != Colors.Transparent)
{
// NormalColorRectControl.Visibility = Visibility.Visible;
// NormalColorRectControl.Fill = new SolidColorBrush(e);
}
else
{
// TransparentRectControl.Visibility = Visibility.Visible;
}
SelectedColor = e;
SelectedColorChanged?.Invoke(this, SelectedColor);
}
RemoveFromLayer();
}
public Point GetOffsetToWindow(DependencyObject dependencyObject = null)
{
Window parentWnd = Window.GetWindow(this);
if (dependencyObject != null)
{
var frame = dependencyObject as FrameworkElement;
if(frame != null)
{
return frame.TransformToAncestor(parentWnd).Transform(new Point(0, 0));
}
}
return TransformToAncestor(parentWnd).Transform(new Point(0, 0));
}
public void SetThemeColors(List themeColorList)
{
if (colorPop != null)
{
colorPop.ThemeColors.Clear();
foreach (Color themeColor in themeColorList)
{
colorPop.ThemeColors.Add(themeColor);
}
}
}
public List GetThemeColors()
{
if (colorPop != null)
{
return colorPop.ThemeColors.ToList();
}
return new List();
}
public List GetRecentlyColors()
{
if (colorPop != null)
{
return colorPop.RecentlyColors.ToList();
}
return new List();
}
public void SetSelectedColor(Color setColor)
{
if (SelectedColor != setColor)
{
// NormalColorRectControl.Visibility = Visibility.Collapsed;
// TransparentRectControl.Visibility = Visibility.Collapsed;
if (setColor != Colors.Transparent)
{
// NormalColorRectControl.Visibility = Visibility.Visible;
// NormalColorRectControl.Fill = new SolidColorBrush(setColor);
}
else
{
// TransparentRectControl.Visibility = Visibility.Visible;
}
SelectedColor = setColor;
if (colorPop != null)
{
colorPop.AddColorToRecent(setColor);
}
}
}
public void ClearSelectColor()
{
_selectedColor = null;
// NormalColorRectControl.Visibility = Visibility.Collapsed;
// TransparentRectControl.Visibility = Visibility.Collapsed;
}
}
}