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();
}
}