在DrawingContext中实现选择

时间:2011-01-20 10:07:24

标签: c# wpf

我有一个使用DrawingContext绘制矩形的基础结构代码,我希望这些矩形具有click事件。我怎么能这样做?

这是我绘制矩形的方式

dc.DrawRectangle(bg,Stroke,rect);

3 个答案:

答案 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可以控制它。