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.StrokesChangedStroke.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 に答える