2013-10-15 39 views
1

我想在用户单击的画布上的点绘制矩形。我希望我的窗口可缩放,因此我已将Canvas放置在视图框中,但这不会在指定点上绘制矩形,而是基于视框的缩放而变化。 这里是我的代码在wpf中的viewbox上单击点绘制形状

<Viewbox MouseLeftButtonDown="Viewbox_MouseLeftButtonDown" Width="300" Height="300"> 
    <Canvas Name="Surface" MouseLeftButtonDown="Surface_MouseRightButtonDown" Background="Transparent" Width="300" Height="300"></Canvas> 
</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); 
    } 

结果是,即使我打电话画布鼠标事件一样。

回答

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