WPFのテキストボックスに貼り付けられたデータをインターセプトしようとしています。WPFテキストボックスに「データを貼り付ける」ことを許可する
たとえば、ユーザーはWindowsスナップツール を使用して画像キャプチャを作成し、自動的に画像データをクリップボードに配置します。ここでのアイデアは にあります。私はそれを傍受して、それが のデータであるかどうかを確認して、それから私が望むものを何でもしようとするために、ユーザーにTextBoxを単純にCTRL + Vすることができます。
上記の動作を使用してpublic class PasteBehavior : Behavior<UIElement>
{
protected override void OnAttached()
{
base.OnAttached();
DataObject.AddPastingHandler(AssociatedObject, new DataObjectPastingEventHandler(OnPaste));
}
protected override void OnDetaching()
{
base.OnDetaching();
}
private void OnPaste(object sender, DataObjectPastingEventArgs e)
{
if (e.SourceDataObject.GetDataPresent(DataFormats.Text))
return;
var formats = e.SourceDataObject.GetFormats();
foreach (var format in formats)
Console.WriteLine(format);
}
}
、テキストはテキストボックス に貼り付けられたときにコードがトリガ取得んが、それは、テキストではない場合はそれもこのコードに到達したことがないので、テキストボックスに何かを貼り付けることを許可しないと思われます。
私は(テキストボックスは、そのデータを表示することはできませんが)データを貼り付けることができるようになるのTextBoxに設定する必要が財産、または何か他のもの があり、思ったんだけど
ない場合どのUI要素でデータを貼り付けることができるのか、私の利点にも使えるかもしれません。
更新 誰かが私は私が使用できるものではありません。このような
を、貼り付けできるように、リッチテキストボックスを使用する必要があるだろうと私にアウト投稿ので、私は別の(ややハック)アプローチを取ることにしました:
public class PasteBehavior : Behavior<UIElement>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;
}
void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.V)
{
if (Clipboard.ContainsData(DataFormats.Dib))
{
using (var stream = new MemoryStream())
{
var image = Clipboard.GetImage();
var message = new ImagePastedMessage()
{
ImageData = GetImagePngData(image)
};
Messenger.Default.Send(message);
}
e.Handled = true;
}
else if (Clipboard.ContainsFileDropList())
{
var results = Clipboard.GetFileDropList();
var filenames = new string[results.Count];
results.CopyTo(filenames, 0);
var message = new FilesDroppedMessage()
{
Filenames = filenames
};
Messenger.Default.Send(message);
e.Handled = true;
}
}
}
protected override void OnDetaching()
{
base.OnDetaching();
}
private byte[] GetImagePngData(BitmapSource source)
{
using (var stream = new MemoryStream())
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(source));
encoder.Save(stream);
return stream.ToArray();
}
}
}
これは私がテキストボックスに画像やファイルを貼り付けるだけ のTextBoxのデフォルトのコンテキストメニューを使用していない、CTRL + Vキーを使用することができます。
より良い/簡単な方法
があるのであれば、私はまだ知ることに興味がアップデート2 本当によく働くダニエルによるソリューションに基づいて、私はOnAttachedを更新しました:
protected override void OnAttached()
{
base.OnAttached();
CommandManager.AddPreviewCanExecuteHandler(AssociatedObject, onPreviewCanExecute);
CommandManager.AddPreviewExecutedHandler(AssociatedObject, onPreviewExecuted);
}
PreviewKeyDownHandlerを削除しました。
コードスニペットの1つで、CTRL + Vを明示的に処理しています。 - ユーザーは、たとえば、異なるキーの組み合わせになるようにペーストを構成している可能性があります。あなたが扱うことができるOSからのより広い "ペースト"メッセージがなければなりません。 – BrainSlugs83