如何以编程方式处理Canvas事件WPF?

时间:2014-04-17 09:25:03

标签: c# wpf canvas event-handling

我自动在代码后面绘制几个画布。那么我如何处理每个画布的事件呢?

将画布添加到堆栈面板并尝试向每个画布添加处理程序:

 for (int i = 0; i < canvases.Count; i++)
 {

     canvases[i] = new Canvas();
     canvases[i].Width = sheetWidth;
     canvases[i].Height = sheetHeight;
     canvases[i].Background = Brushes.White;

     canvases[i].MouseWheel += new MouseWheelEventHandler((object sender,MouseWheelEventArgs e) =>
     {

          double ScaleRate = 1.00000001;

          ScaleTransform scaletransform = new ScaleTransform();

          if (e.Delta > 0)
          {
              scaletransform.ScaleX *= ScaleRate;
              scaletransform.ScaleY *= ScaleRate;
          }
          else
          {
              scaletransform.ScaleX /= ScaleRate;
              scaletransform.ScaleY /= ScaleRate;
          }

          canvases[i].RenderTransform = scaletransform;
    });

    stackPanel.Children.Add(canvases[i]);

 }

当我尝试移动鼠标滚轮时,以这种形式抛出System.IndexOutOfRangeException ......

1 个答案:

答案 0 :(得分:0)

尝试更改您的代码:

for (int i = 0; i < canvases.Count; i++)
{
    canvases[i] = new Canvas();
    canvases[i].Width = sheetWidth;
    canvases[i].Height = sheetHeight;
    canvases[i].Background = Brushes.White;
    canvases[i].RenderTransform = new ScaleTransform(); // here !!!

    canvases[i].MouseWheel += (sender, e) =>
    {
        double ScaleRate = 1.00000001; // really ??

        var canvas = (Canvas)sender;
        var scaletransform = (ScaleTransform)canvas.RenderTransform;

        if (e.Delta > 0)
        {
            scaletransform.ScaleX *= ScaleRate;
            scaletransform.ScaleY *= ScaleRate;
        }
        else
        {
            scaletransform.ScaleX /= ScaleRate;
            scaletransform.ScaleY /= ScaleRate;
        }
   };

   stackPanel.Children.Add(canvases[i]);

}