1

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

   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 绑定到笔划,因为自定义 inkcanvas 将调用 StrokeCollection.CollectionChanged 事件 3 次。

任何帮助表示赞赏。

4

2 回答 2

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

于 2014-08-18T05:15:35.083 回答
1

您只需像以前那样通过 XAML 绑定它,这是正确的方法。

你得到3个事件,没关系。只需处理您需要的那个。

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

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

     // handle the event
}

有关事件的完整列表,请参阅 InkCanvas MSDN 文档的“字段”部分。以“Event”结尾的字段是 RoutedEvent 常量,在InkCanvasStrokeCollectedEventArgs.

于 2014-08-18T08:33:04.060 回答