0

我正在开发 WPF 应用程序,其中有一些显示美元金额的文本框。每当焦点出现在文本框上时,我只想选择文本框中的所有内容。

为了达到同样的效果,我在“GotFocus”事件上使用了文本框的 SelectAll() 方法,但它不能按预期工作。

请让我知道如何才能发挥作用。谢谢

4

3 回答 3

0

您可以为此创建附加行为并将其用于所需的文本框。此处详细说明了此方法-

http://eladm.wordpress.com/2009/04/02/attached-behavior/

此类行为的代码也可在此处此处获得

如果您希望应用程序中的所有文本框默认都具有此功能,请查看此处 -

如何在焦点上选择 WPF 文本框中的所有文本

于 2012-05-11T07:29:19.827 回答
0

在启动时,为文本框注册一个全局事件处理程序,例如

 EventManager.RegisterClassHandler(typeof(System.Windows.Controls.Primitives.TextBoxBase), UIElement.GotFocusEvent, new RoutedEventHandler(TextBoxBaseGotFocus));

TextBoxBaseGotFocus 方法是这样的:

    private static void TextBoxBaseGotFocus(object sender, RoutedEventArgs e)
{
     // Get the TextBoxBase
     var elem = sender as System.Windows.Controls.Primitives.TextBoxBase;
     if (elem != null)
     {
         elem.SelectAll();
     }
}
于 2012-05-11T09:55:34.640 回答
0

您是否尝试过处理 FocusableChanged 事件 http://msdn.microsoft.com/en-us/library/system.windows.uielement.focusablechanged.aspx

您可以在 FocusableChanged 事件处理程序中检查 IsFocused。如果 IsFocused 为真,则可以调用 SelectAll 以下是伪代码

textBox.FocusableChanged += (s,e) =>
{
   if(textBox.IsFocused)
     testBox.SelectAll();
}

EDIT1
如上不起作用,您可以尝试 FocusManger.GetFocusedElement。
确定焦点元素

public DebugFocusedElementProxy()
{
    var timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromMilliseconds(100);
    timer.Tick += (o, ea) =>
    {
        var fe = FocusManager.GetFocusedElement();
        if (fe != null)
        {
            var element = fe as FrameworkElement;
            if (!string.IsNullOrEmpty(element.Name) &&
                 String.Equals(element.Name, textBox))
            {
                textBox.SelectAll();
            }
        }
    };
    timer.Start();
}

//注意 textBox.SelectAll 可能需要在Dispatcher Thread上调用

于 2012-05-11T05:19:56.247 回答