2

基本上我想要做的是为我的画布触发一种“脏”状态,以便我知道是否有未保存的更改。

WPF InkCanvas 中是否有一个事件可以在笔画发生变化时随时处理?

如果没有,我应该听什么事件来获得等价物?我的第一个猜测是:

StrokeCollected
StrokeErased
StrokesReplaced

虽然我可能是错的,并且错过了一个边缘案例。

注意:如果我得到误报(实际上没有被标记为脏),这没什么大不了的,但我不想要误报。

4

1 回答 1

2

这些事件似乎可以完成这项工作:

  • InkCanvas.StrokesReplaced(在设置 Strokes 属性时发生)
  • StrokeCollection.StrokesChanged(在添加或删除笔画时发生)
  • Stroke.StylusPointsChanged(当笔画的形状改变时发生)
  • Stroke.StylusPointsReplaced(设置 StylusPoints 属性时发生)
  • Stroke.DrawingAttributesChanged(当笔画的属性改变时发生)
  • Stroke.DrawingAttributesReplaced(在设置 DrawingAttributes 属性时发生)

就我而言,我从不替换属性或更改绘图属性,所以我只使用StrokeCollection.StrokesChangedand Stroke.StylusPointsChanged。这是我的代码片段。

public MainWindow()
{
    inkCanvas.Strokes.StrokesChanged += Strokes_StrokesChanged;
}

private void Strokes_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e)
{
    // Mark dirty
    foreach (Stroke stroke in e.Added)
    {
        stroke.StylusPointsChanged += stroke_StylusPointsChanged;
    }
    foreach (Stroke stroke in e.Removed)
    {
        stroke.StylusPointsChanged -= stroke_StylusPointsChanged;
    }
}

private void stroke_StylusPointsChanged(object sender, System.EventArgs e)
{
    // Mark dirty
}
于 2012-11-15T00:30:09.927 回答