これはおそらく添付プロパティ (動作) で実現できると思いますが、 、、および同様のメソッドを単純にサブクラス化TextBox
してオーバーライドし、カスタム機能を追加する方がはるかに単純で簡単です。OnTextChanged
OnKeyDown
OnKeyUp
この方法で独自のコントロールを作成してみませんか?
更新: アタッチされた動作
派生コントロールが本当に必要ない場合は、これを実現する添付の動作を次に示します (以下の説明)。
public class ScanReading
{
private static readonly IDictionary<TextBox, ScanInfo> TrackedTextBoxes = new Dictionary<TextBox, ScanInfo>();
public static readonly DependencyProperty ScanCompletedCommandProperty =
DependencyProperty.RegisterAttached("ScanCompletedCommand", typeof (ICommand), typeof (ScanReading),
new PropertyMetadata(default(ICommand), OnScanCompletedCommandChanged));
public static void SetScanCompletedCommand(TextBox textBox, ICommand value)
{
textBox.SetValue(ScanCompletedCommandProperty, value);
}
public static ICommand GetScanCompletedCommand(TextBox textBox)
{
return (ICommand) textBox.GetValue(ScanCompletedCommandProperty);
}
private static void OnScanCompletedCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
if (textBox == null)
return;
var command = (ICommand) e.NewValue;
if (command == null)
{
textBox.Unloaded -= OnTextBoxUnloaded;
textBox.KeyUp -= OnTextBoxKeyUp;
TrackedTextBoxes.Remove(textBox);
}
else
{
textBox.Unloaded += OnTextBoxUnloaded;
TrackedTextBoxes.Add(textBox, new ScanInfo(command));
textBox.KeyUp += OnTextBoxKeyUp;
}
}
static void OnTextBoxKeyUp(object sender, KeyEventArgs e)
{
var textBox = (TextBox) sender;
var scanInfo = TrackedTextBoxes[textBox];
if (scanInfo.IsTracking)
{
if (e.Key == Key.Return)
{
scanInfo.ScanCompletedCommand.Execute(textBox.Text);
scanInfo.IsTracking = false;
}
}
else if (string.IsNullOrEmpty(textBox.Text) && e.Key == Key.Pause)
{
TrackedTextBoxes[textBox].IsTracking = true;
}
}
static void OnTextBoxUnloaded(object sender, RoutedEventArgs e)
{
var textBox = (TextBox) sender;
textBox.KeyUp -= OnTextBoxKeyUp;
textBox.Unloaded -= OnTextBoxUnloaded;
TrackedTextBoxes.Remove(textBox);
}
}
public class ScanInfo
{
public ScanInfo(ICommand scanCompletedCommand)
{
ScanCompletedCommand = scanCompletedCommand;
}
public bool IsTracking { get; set; }
public ICommand ScanCompletedCommand { get; private set; }
}
これを次のTextBox
ように宣言して使用します (local
は添付プロパティの名前空間であり、ScanCompleted
ビューICommand
モデルでは です)。
<TextBox local:ScanReading.ScanCompletedCommand="{Binding ScanCompleted}" />
このプロパティが設定されるTextBox
と、関連付けられた とともに静的コレクションにを追加しICommand
ます。
キーが押されるたびに、それがPauseキーであるかどうかを確認します。そうであり、が空の場合はTextBox
、フラグを設定しtrue
て、キーの検索を開始しEnterます。
キーが押されるたびに、それがEnterキーであるかどうかを確認します。そうであれば、コマンドを実行して値を渡し、TextBox.Text
そのフラグを にリセットfalse
しTextBox
ます。
TextBox.Unloaded
また、イベント サブスクリプションをクリーンアップTextBox
し、静的リストから削除するイベントのハンドラーも追加しました。