using System; using System.Windows.Controls.Primitives; using System.Windows.Documents; using System.Windows.Media; using System.Windows; using System.Windows.Shapes; using Size = System.Windows.Size; using EGC = ExtendedGrid.Microsoft.Windows.Controls; namespace MECF.Framework.UI.Client.DataGridTransform.DataGrid.Microsoft.Windows.Controls.Primitives { public class DataGridCellDragToFillAdorner : Adorner { public event EventHandler OnDragStart; public event EventHandler OnDragCompleted; public event EventHandler OnDragDelta; private readonly VisualCollection _adornerVisuals; private readonly Thumb _thumb2; private readonly Rectangle _rec; private readonly Rectangle _recShadow; private Rect _lastBoundRect; private Brush _disabledStroke; #region Constructors public DataGridCellDragToFillAdorner(UIElement adornedElement, Size originCellSize) : base(adornedElement) { _lastBoundRect = new Rect(0, 0, originCellSize.Width, originCellSize.Height); _adornerVisuals = new VisualCollection(this); _disabledStroke = Brushes.DarkGray; _rec = new Rectangle() { StrokeThickness = 2 }; _recShadow = new Rectangle() { StrokeThickness = 2, StrokeDashArray = { 1, 1 }, Opacity = 0.5, Visibility = Visibility.Hidden }; _thumb2 = new Thumb(); _thumb2.DragStarted += Thumb2OnDragStarted; _thumb2.DragDelta += Thumb2_DragDelta; _thumb2.DragCompleted += Thumb2OnDragCompleted; _adornerVisuals.Add(_rec); _adornerVisuals.Add(_recShadow); _adornerVisuals.Add(_thumb2); } #endregion #region Properties protected override int VisualChildrenCount => _adornerVisuals.Count; internal int StartCellIndex { get; private set; } internal int EndCellIndex { get; private set; } #endregion #region Dps public static readonly DependencyProperty ThumbStyleProperty = DependencyProperty.Register( nameof(ThumbStyle), typeof(Style), typeof(DataGridCellDragToFillAdorner), new PropertyMetadata(default(Style))); public Style ThumbStyle { get => (Style)GetValue(ThumbStyleProperty); set => SetValue(ThumbStyleProperty, value); } public static readonly DependencyProperty StrokeProperty = DependencyProperty.Register( nameof(Stroke), typeof(Brush), typeof(DataGridCellDragToFillAdorner), new PropertyMetadata(default(Brush))); public Brush Stroke { get => (Brush)GetValue(StrokeProperty); set => SetValue(StrokeProperty, value); } #endregion #region Methods protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); if(e.Property == IsEnabledProperty || e.Property == ThumbStyleProperty || e.Property == StrokeProperty) ApplyStyle(); } protected override Visual GetVisualChild(int index) { return _adornerVisuals[index]; } protected override Size ArrangeOverride(Size finalSize) { /*_rec.Arrange(_lastBoundRect); _thumb2.Arrange(new Rect(_lastBoundRect.Width - 5, _lastBoundRect.Height + _lastBoundRect.Y - 5, 10, 10));*/ _rec.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); //_recShadow.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); _thumb2.Arrange( new Rect(finalSize.Width - _thumb2.Width / 2, finalSize.Height - _thumb2.Height / 2, _thumb2.Width, _thumb2.Height)); return base.ArrangeOverride(finalSize); } private void ApplyStyle() { SetThumbStyle(); SetStroke(); if (IsEnabled == false) { _rec.Stroke = _disabledStroke; _recShadow.Stroke = _disabledStroke; _recShadow.Visibility = Visibility.Hidden; _thumb2.Background = _disabledStroke; } } private void SetThumbStyle() { if (ThumbStyle != null && ThumbStyle.TargetType == typeof(Thumb)) _thumb2.Style = ThumbStyle; else { // Load default style LoadDefaultThumbStyle(); } } private void SetStroke() { _rec.Stroke = Stroke; _recShadow.Stroke = Stroke; } private void LoadDefaultThumbStyle() { _thumb2.Width = 10; _thumb2.Height = 10; _thumb2.Background = Stroke; _thumb2.BorderThickness = new Thickness(0); } /// /// 绘制选择范围的虚线框。 /// /// /// /// internal void ArrangeSelectionBound(Rect boundRect, int startCellIndex, int endCellIndex) { _lastBoundRect.X = boundRect.X; _lastBoundRect.Y = boundRect.Y; _lastBoundRect.Width = boundRect.Width; _lastBoundRect.Height = boundRect.Height; _recShadow.Arrange(_lastBoundRect); StartCellIndex = startCellIndex; EndCellIndex = endCellIndex; //Debug.WriteLine($"Adorner Bound: {_lastBoundRect}", "Adorner"); } /// /// 获取拖动选择的范围。 /// /// internal Rect GetSelectionBound() { return _lastBoundRect; } /// /// 取消填充操作。 /// internal void Cancel() { if (_thumb2.IsDragging) _thumb2.CancelDrag(); } #endregion #region Event Handlers private void Thumb2OnDragStarted(object sender, DragStartedEventArgs e) { _recShadow.Visibility = Visibility.Visible; OnDragStart?.Invoke(this, e); } private void Thumb2OnDragCompleted(object sender, DragCompletedEventArgs e) { _recShadow.Visibility = Visibility.Hidden; if (!e.Canceled) { _rec.Arrange(_lastBoundRect); _recShadow.Arrange(_lastBoundRect); _thumb2.Arrange( new Rect(_lastBoundRect.Width - _thumb2.Width / 2, _lastBoundRect.Height + _lastBoundRect.Y - _thumb2.Height / 2, _thumb2.Width, _thumb2.Height)); OnDragCompleted?.Invoke(this, e); } } private void Thumb2_DragDelta(object sender, DragDeltaEventArgs e) { OnDragDelta?.Invoke(this, e); } #endregion } }