WPF装饰器的使用-在底层控件(图片、画布)上进行框选

WPF 装饰器的使用

核心:装饰器

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace Test.Models
{
    public class ListViewSimpleAdorner : Adorner
    {
        public SolidColorBrush backgroundBrush { get; set; }
        public SolidColorBrush penBrush { get; set; }
        public Pen drawingPen { get; set; }

        // 更新此属性将自动触发底层 OnRender 方法
        public Rect HighlightArea
        {
            get { return (Rect)GetValue(HighlightAreaProperty); }
            set { SetValue(HighlightAreaProperty, value); }
        }

        public static readonly DependencyProperty HighlightAreaProperty =
           DependencyProperty.Register("HighlightArea", typeof(Rect),
           typeof(ListViewSimpleAdorner), new FrameworkPropertyMetadata(new Rect(),
           FrameworkPropertyMetadataOptions.AffectsRender));

        public ListViewSimpleAdorner(UIElement element)
          : base(element)
        {
            backgroundBrush = new SolidColorBrush(Colors.LightBlue);
            backgroundBrush.Opacity = 0.5;
            penBrush = new SolidColorBrush(Colors.Black);
            penBrush.Opacity = 0.5;
            drawingPen = new Pen(penBrush, 1);
            this.IsHitTestVisible = false;
        }

        protected override void OnRender(DrawingContext dc)
        {
            dc.DrawRectangle(backgroundBrush, drawingPen, HighlightArea);
        }
    }
}

使用

/// <summary>
/// FileDataCalView.xaml 的交互逻辑
/// </summary>
public partial class FileDataCalView : UserControl
{
    ListViewSimpleAdorner myAdorner { get; set; }
    Point? myDragStartPoint { get; set; }

    List<ConstituencyPart> curItems = new List<ConstituencyPart>();
    public FileDataCalView()
    {            
        this.Initialized += delegate
        {
            AdornerLayer.GetAdornerLayer(SourceFileListViewS).Add(myAdorner =
            new ListViewSimpleAdorner(SourceFileListViewS));
            
            //确认鼠标起始位置
            SourceFileListViewS.PreviewMouseDown += (o, e) =>
            {
                if (e.ChangedButton == MouseButton.Left)
                {
                    myDragStartPoint = e.GetPosition(SourceFileListViewS);
                    //SourceFileListViewS.SelectedItems.Clear();
                }
            };

			//鼠标开始进行框选
            SourceFileListViewS.MouseMove += (o, e) =>
            {
                if (myDragStartPoint.HasValue)
                {
                    Rect r = new Rect(myDragStartPoint.Value,
                    e.GetPosition(SourceFileListViewS) - myDragStartPoint.Value);
                    myAdorner.HighlightArea = r;
                    curItems = SourceFileListViewS.GetItemAt<ConstituencyPart>(r);                       
                    //else
                    //    SourceFileListViewS.SelectedItems.Clear();
                }
            };

			//鼠标释放
            SourceFileListViewS.MouseUp += (o, e) =>
            {
                if (e.ChangedButton == MouseButton.Left)
                {
                    if (curItems.Count > 1)
                    {
                        //SourceFileListViewS.SelectedItems.Clear();
                        foreach (var i in curItems)
                        {
                            if (!SourceFileListViewS.SelectedItems.Contains(i))
                            {
                                SourceFileListViewS.SelectedItems.Add(i);
                            }
                        }
                    }

                    curItems.Clear();
                    myDragStartPoint = null;
                    myAdorner.HighlightArea = new Rect();
                }
            };

			//鼠标离开控件
            SourceFileListViewS.MouseLeave += (o, e) =>
            {
                myDragStartPoint = null;
                myAdorner.HighlightArea = new Rect();
            };
        };
        InitializeComponent();
    }

    private void Box_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        ComboBox thisBox = (ComboBox)sender;
        thisBox.IsDropDownOpen = true;
    }

    private void SourceFileListViewS_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Globals.NoConstituencyList.Clear();
        foreach (var i in SourceFileListViewS.SelectedItems)
        {
            var pConstituencyPart = (ConstituencyPart)(i);
            Globals.NoConstituencyList.Add(pConstituencyPart.ConstituencyIndex);
        }
        Globals.NoConstituencyList.Sort();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值