在wpf中的视图框上的单击点处绘制形状

时间:2013-10-15 15:23:29

标签: wpf-controls viewbox

我正在尝试在用户点击的画布中绘制一个矩形。我希望我的窗口可以缩放,所以我将Canvas放在一个视图框中,但这并不是在指定的点上绘制矩形,而是根据视图框的缩放而变化。 这是我的代码

<Viewbox MouseLeftButtonDown="Viewbox_MouseLeftButtonDown" Width="300" Height="300">
    <Canvas Name="Surface" MouseLeftButtonDown="Surface_MouseRightButtonDown" Background="Transparent" Width="300" Height="300"></Canvas>
</Viewbox>

这里是viewbox鼠标按下事件

 private void Viewbox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Rectangle rect = new Rectangle { Width = 10, Height = 10, Fill = Brushes.Black };
        Surface.Children.Add(rect);
        Canvas.SetLeft(rect, e.GetPosition(this).X);
        Canvas.SetTop(rect, e.GetPosition(this).Y);
    }

即使我调用Canvas鼠标事件,结果也一样。

1 个答案:

答案 0 :(得分:0)

Viewbox控件没有背景,因此无法接收鼠标事件。我将Canvas包装在一个边框中,背景设置为透明,并在那里附加我的事件处理程序。设置Viewbox的宽度和高度也没有多大意义,因为您可能希望它与内容一起扩展。

<Viewbox Width="300" Height="300">
  <Border Background="Transparent"            
          MouseLeftButtonDown="Border_MouseLeftButtonDown"
    <Canvas Name="Surface" Background="Transparent" Width="300" Height="300"/>
  </Border>
</Viewbox>

您的另一个问题是您获得相对于this的鼠标位置。我不知道this是什么,但你想获得相对于画布的鼠标位置。

 private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 {
     var rect = new Rectangle { Width = 10, Height = 10, Fill = Brushes.Black };
     Surface.Children.Add(rect);
     Canvas.SetLeft(rect, e.GetPosition(Surface).X);
     Canvas.SetTop(rect, e.GetPosition(Surface).Y);
 }