我有一个使用DrawingContext绘制矩形的基础结构代码,我希望这些矩形具有click事件。我怎么能这样做?
这是我绘制矩形的方式
dc.DrawRectangle(bg,Stroke,rect);
答案 0 :(得分:1)
那个矩形只是像素,它不能有任何事件。
您必须查看该DC的所有者(Control)。或者只使用Rectangle
元素。
答案 1 :(得分:0)
您可以使用HitTest
的{{1}}功能。这样的事情可以帮助你(当你点击要检查命中的地方的鼠标时执行这段代码):
VisualTreeHelper
答案 2 :(得分:0)
您应该放置ItemsControl并将其ItemsSource属性绑定到矩形集合。 然后,您应该覆盖ItemsControl.ItemTemplate并提供您自己的DataTemplate,其中包含显示Rectangle的自定义用户控件。此用户控件能够处理鼠标事件。
主机窗口的XAML:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:self ="clr-namespace:Test"
Title="MainWindow"
Height="350" Width="700">
<Window.Resources>
<DataTemplate x:Key="RectTemplate">
<self:RectangleView />
</DataTemplate>
</Window.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding Rectangles}"
ItemTemplate="{StaticResource RectTemplate}">
</ItemsControl>
</Grid>
和RectangleView:
<UserControl x:Class="Test.RectangleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" >
MainWindow背后的代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public IEnumerable<Rect> Rectangles
{
get
{
yield return new Rect(new Point(10, 10), new Size(100, 100));
yield return new Rect(new Point(50, 50), new Size(400, 100));
yield return new Rect(new Point(660, 10), new Size(10, 100));
}
}
}
和RectangleView背后的代码:
public partial class RectangleView : UserControl
{
public RectangleView()
{
InitializeComponent();
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
drawingContext.DrawRectangle(Brushes.Orchid, new Pen(Brushes.OliveDrab, 2.0), (Rect)this.DataContext);
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
// HERE YOU CAN PROCCESS MOUSE CLICK
base.OnMouseDown(e);
}
}
我建议您阅读有关ItemsControl,ItemContainers,DataTemplates和Styles的更多信息。
P.S。由于时间限制,我将视图和模型逻辑合并到MainView和RectangleView的一个类中。在良好的实现中,你应该有MainView(MainModel)的表示模型和RectangleView(RectangleViewData)的表示模型,除了MainModel声明IEnumerable类型的属性。由于RectangleViewData与属性更改无关,因此MainModel可以控制它。