「SelectAllOnFocus」という添付プロパティがあります。true/false の値。
public static class TextBoxProps
{
private static void MyTextBoxKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
((TextBox)sender).Text = string.Empty;
}
}
public static void SetSelectAllOnFocus(DependencyObject dependencyObject, bool selectAllOnFocus)
{
if (!ReferenceEquals(null, dependencyObject))
{
dependencyObject.SetValue(SelectAllOnFocus, selectAllOnFocus);
}
}
public static bool GetSelectAllOnFocus(DependencyObject dependencyObject)
{
if (!ReferenceEquals(null, dependencyObject))
{
return (bool)dependencyObject.GetValue(SelectAllOnFocus);
}
else
{
return false;
}
}
private static void OnSelectAllOnFocus(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
bool selectAllOnFocus = (bool)e.NewValue == true;
var theTextBox = d as TextBox;
if (selectAllOnFocus && theTextBox != null)
{
theTextBox.PreviewMouseDown -= MyTextBoxMouseEnter; theTextBox.PreviewMouseDown += MyTextBoxMouseEnter;
}
}
private static void MyTextBoxMouseEnter(object sender, MouseEventArgs e)
{
((TextBox)sender).SelectAll();
e.Handled = false;
}
public static readonly DependencyProperty SelectAllOnFocus
= DependencyProperty.RegisterAttached("SelectAllOnFocus", typeof(bool), typeof(TextBoxEscapeProperty),
new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnSelectAllOnFocus)));
}
何が起こるかは次のとおりです。
- PreviewMouseDown イベントがトリガーされます。
- MyTextBoxMouseEnter メソッドが呼び出されます。
- SelectAll() メソッドが呼び出されます。
- ((TextBox)sender).SelectedText で「監視」を行うと、値は正しいです (つまり、テキスト ボックスにあるものはすべて selectedText として表示されます)。
- テキストボックス自体は変更されていません。テキストが選択されていません。
これは一般的な WPF スタイルの一部です。アプリケーション内のすべてのテキスト ボックスは、このプロパティとそれに関連する動作を受け取る必要があります。
私は困惑しています。何か案は?
ありがとう