###現象
クリップボードの文字列を取得し、その内容から数値のみを抽出。
抽出した文字列と元々入力されている文字列を結合したい。
例:テキストボックスに「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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/28 11:11