2

私の WPF アプリケーションは、クリップボード上のデータをチェックして、データを処理できるかどうかを確認します。データに基づいて (ICommand実装を介して) いくつかのボタンを有効/無効に設定したため、このコードは頻繁に呼び出されます。

アプリケーションがデータを処理できるかどうかを判断する作業は、時には簡単ではなく、アプリケーションがランダムに「ハング」する原因になります。WPF ランタイムは迅速な応答を期待しているため、この作業を別のスレッドにプッシュできるとは思えません。

この問題を解決するために、IDataObjects (クリップボードからの現在のものと前回の試行でキャッシュされたもの) を比較することを考えました。単純な比較 (そして、でもobject.ReferenceEquals目的の結果が返されないので、私はそうすると思いましたメソッドを試してみてくださいClipboard.IsCurrent. 説明はまさに私が望むもののように聞こえますが、次のことを評価すると:

Clipboard.IsCurrent(Clipboard.GetDataObject())

結果はfalseです。現在の回避策は、IDataObject のデータ形式を比較することですが、私のアプリケーションはファイル システムの一部のファイルを処理できますが、すべてのファイルを処理できるわけではないため、これは良い答えではありません。そのため、形式が同じであっても、アプリケーションがデータを処理できるかどうかの結果は常に同じであるとは限りません。

4

1 に答える 1

3

残念ながら、IsCurrentとの併用はできませんGetDataObjectMSDN のOleIsCurrentClipboard(IsCurrent内部的に使用する) の説明は、これについて非常に明確です。

OleIsCurrentClipboard は、OleSetClipboard 関数で使用されるデータ オブジェクトに対してのみ機能します。以前の OleGetClipboard 呼び出しでクリップボードにあったオブジェクトがまだクリップボードにあるかどうかを判断するために、データ オブジェクトのコンシューマーが呼び出すことはできません。

回避策として、クリップボードの更新をサブスクライブし (例: クリップボード イベント C#を参照)、データが変更されたときのみ、場合によってはバックグラウンド スレッドでデータを評価します。

于 2013-08-13T05:54:22.967 に答える