2012年1月29日日曜日

TextBlock にClipboardへのコピー機能を追加する(改訂版)

前回投稿した「TextBlock にClipboardへのコピー機能を追加する」ですが、
あのコードだと、メモリーは消費するわ、メモリーリークしまくるわで使えないことがわかりました。
ここに、改良版を投稿します
  1. メモリーリークの問題
    右クリックで表示しているContextMenuですが、その右クリックを監視している ContextMenuService自体がメモリーリークを起こしているみたいで、OwnerのTextblockが破棄されれもContextMenuServiceに設定されたContextMenuは残っているみたいです。
  2. メモリーの消費
    コードを読めばわかると思いますが、TextBlockの配下にContextMenuServiceとContextMenu、その下にMenuItemが作成されます。これらの生成されたインスタンス「TextBlockClipBoardService.ID=""」によって、すべてのTextBlockの子となるので、メモリーの消費量がタダモンではありません。

    (実際、設定されたTextBlockをDataGridのCellTempleteに設定したらスクロールが耐えられないほどカクカク)

対応策として

  1. なるべく生成するインスタンスを少なくする
    ContextMenuService は諦め、シングルトンのPopupオブジェクトを表示する
  2. メモリーリークをなくす
    循環参照を撲滅する。
観点に再作成しました。

2012年1月27日金曜日

TextBlock に Clipboard へのコピー機能を追加する

2011/01/29 追記
この方法は、不具合がありました。改訂版は「TextBlock に Clipboard へのコピー機能を追加する(改訂版)」で紹介してます。

とあるお客さんで 「TextBlock に表示している文字列を他のアプリへコピーしたいんだけど...」と要求がありました。
Silverlightで作成したプログラムはすでに完成間近。

手間がかからず、短期間で実装したコードを紹介する。

操作は、TextBlockのテキストを右クリックすると、コンテキストメニューが表示され、メニューを選択すると、クリップボードへコピーする。

参考URL:Silverlight で ContextMenu を使ってみる



  1. TextBlockで右クリック
  2. 選択すると