質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

7481閲覧

WPFのペースト処理で文字列編集しても反映されない。

suzuki123

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2017/02/27 09:35

###現象
クリップボードの文字列を取得し、その内容から数値のみを抽出。
抽出した文字列と元々入力されている文字列を結合したい。

例:テキストボックスに「9」が入力済み。
クリップボードに「111」が記録されている状態で、
テキストボックスの先頭にペースト。

上記例の結果である「1119」が「AddPastingHandler」イベント中にほしいのですが、
文字列のInsertを行っても、結果が更新されませんでした。
(ステップ実行で値を確認した所、何も変化しませんでした。)
(「TextInput」や「TextChanged」ではこのような現象が発生しませんでした。)

###質問
「AddPastingHandler」上では文字列操作は出来ないのでしょうか?
それとも操作するために何か手続きが必要なのでしょうか?

※ペースト後の値を取るだけであれば、恐らく「e.CancelCommand()」をやめて、
「TextChanged」中に取得すれば可能かもしれませんが、
極力「TextChanged」は使用したくありません。(理由は聞かないでください・・・)

###該当のソースコード

<Window x:Class="paste_test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:paste_test" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="200" Height="100" mc:Ignorable="d"> <Grid Background="Black"> <TextBox x:Name="TXT_TEST" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" /> </Grid> </Window>
using System.Windows; using System.Windows.Controls; namespace paste_test { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataObject.AddPastingHandler(TXT_TEST, OnPaste); } private void OnPaste(object sender, DataObjectPastingEventArgs e) { string val = e.DataObject.GetData(typeof(string)) as string; int len = val.Length; val = NgWord(val); //数値のみに絞込み TextBox txt = (TextBox)sender; int pos = txt.SelectionStart; string wk = txt.Text; //範囲選択されてれば削除 len = txt.SelectedText.Length; if (len != 0) { wk.Remove(pos, len); } //カーソル位置に文字列挿入 wk.Insert(pos, val); txt.Text = wk; e.CancelCommand(); } private string NgWord(string val) { if (string.IsNullOrEmpty(val)) { return ""; } int max = val.Length - 1; for (int i = max; i >= 0; i--) { if ((val[i] < '0') || (val[i] > '9')) { val = val.Remove(i, 1); } } return val; } } }

###補足情報(言語/FW/ツール等のバージョンなど)
Windows7 Pro 64bit
visual studio 2015 pro
.NETフレームワーク 4.5.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

string.Remove()、string.Insert()は、反映結果は戻り値を使用しなければいけません。

原因はわかりませんがDataObjectPastingEventArgs.CancelCommand()にて、
貼り付けイベント前の状態に戻ってしまうようですので、処理の順番を入れ替えました。

private void OnPaste(object sender, DataObjectPastingEventArgs e) { string val = e.DataObject.GetData(typeof(string)) as string; int len = val.Length; val = NgWord(val); //数値のみに絞込み TextBox txt = (TextBox)sender; int pos = txt.SelectionStart; string wk = txt.Text; //範囲選択されてれば削除 len = txt.SelectedText.Length; if (len != 0) { //wk.Remove(pos, len); wk = wk.Remove(pos, len); } //カーソル位置に文字列挿入 //wk.Insert(pos, val); wk = wk.Insert(pos, val); //txt.Text = wk; // //e.CancelCommand(); // 処理の順序を変更 e.CancelCommand(); txt.Text = wk; }

投稿2017/02/28 01:37

sugar_yas

総合スコア135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzuki123

2017/02/28 11:11

回答していただいた内容を確認し、恥ずかしさの余り飛び降りそうになりました。(リファレンスを見れば一発で気づく内容・・・) 上記処理を試した所、問題なく加工したデータが受け取れました。 ご回答有難うございます。
guest

0

XAML で TextBox のプロパティAllowDrop を true にしてください。

AllowDrop="True"

---- 追記 ---
ちょっと読み違いをしてましたm(_ _)m
お詫び代わりに私だったら、こう書くってXAMLを載せときます。
MVVMです。

XAML

1<TextBox Text="{Binding MyText}" Name="myTextBox" Width="150"> 2 <TextBox.InputBindings> 3 <KeyBinding Gesture="Shift+Insert" Command="{Binding PasteCommand}"/> 4 <KeyBinding Gesture="Ctrl+V" Command="{Binding PasteCommand}"/> 5 </TextBox.InputBindings> 6 <TextBox.ContextMenu> 7 <ContextMenu> 8 <MenuItem Header="切り取り" Command="{Binding CutCommand}" 9 CommandParameter="{Binding RelativeSource={RelativeSource 10 AncestorType=TextBox},Path=SelectedText}"/> 11 <MenuItem Header="コピー" Command="{Binding CopyCommand}" 12 CommandParameter="{Binding RelativeSource={RelativeSource 13 AncestorType=TextBox},Path=SelectedText}"/> 14 <MenuItem Header="貼り付け" Command="{Binding PastCommand}"/> 15 </ContextMenu> 16 </TextBox.ContextMenu> 17</TextBox>

投稿2017/02/27 10:00

編集2017/02/28 02:06
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzuki123

2017/02/27 10:39

今回の内容はただのコピー&ペーストなのでD&Dは対応しません。 念のために記載内容どおりに対応しましたが結果は変わらずでした。
suzuki123

2017/02/28 11:15

そもそも自分がWPFを使用しているのにMVVM形式での組み方を行っていなかったため、 追記していただいた内容が動作出来るまで持っていくのに時間がかかっております。 そのため、返答出来るまで少々お時間がかかります。 申し訳ございません。 出来次第試した結果を記載したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問