如何在视图模型中接收InkCanvas.StrokeCollected事件

时间:2014-08-18 04:59:59

标签: wpf mvvm inkcanvas

在使用MVVM模式时,我有一个自定义的墨迹:

   protected override void OnStrokeCollected(InkCanvasStrokeCollectedEventArgs e)
    {
        CustomStroke newStroke = new CustomStroke(e.Stroke.StylusPoints, e.Stroke.DrawingAttributes);
        this.Strokes.Remove(e.Stroke);
        this.Strokes.Add(newStroke);
        InkCanvasStrokeCollectedEventArgs eNew = new InkCanvasStrokeCollectedEventArgs(newStroke);

        // Raises the System.Windows.Controls.InkCanvas.StrokeCollected event.
        base.OnStrokeCollected(eNew);
    }

如何让视图模型接收InkCanvas.StrokeCollected事件?

我无法将XAML绑定到笔划,因为StrokeCollection.CollectionChanged事件将被自定义墨迹扫描三次调用。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

试试这个

    public Window3()
    {
        InitializeComponent();
        var vm=new ViewModel();
        this.DataContext = vm;
        canvas.StrokeCollected += vm.OnStrokeCollected;
    }
  

视图模型

public class ViewModel
{
    public void OnStrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
    { 

    }
}
  

修改

如果您想在没有代码隐藏的情况下执行此操作,请参阅文章EventTrigger

答案 1 :(得分:1)

您只需通过XAML将其绑定,就像您已经做的那样,这是正确的方法。

你得到3个事件,并不重要。只需处理您需要的那个。

例如,如果您只对StrokeCollectedEvent感兴趣,那么只需执行

protected override void OnStrokeCollected(InkCanvasStrokeCollectedEventArgs e)
{
     if(e.RoutedEvent != InkCanvas.StrokeCollectedEvent) 
         return;

     // handle the event
}

有关活动的完整列表,请参阅" Fields" InkCanvas MSDN文档的一节。以" Event"结尾的字段;是RoutedEvent常量,它们在InkCanvasStrokeCollectedEventArgs

中传递