Cursor Focus on Textbox in WPF/C#

2019-03-08 15:58发布

I am currently in the process of creating a Onscreen keyboard. I am handling the button click using routedcommands. The issue is that when i click on the button in keyboard panel the focus shifts to the button rather than on the Textbox. The requirement states that a cursor should always appear in the text box to indicate the position where the next character will be inserted. Is there a way i can keep focus on the textbox while button is clicked.

标签: c# wpf textbox
8条回答
我欲成王,谁敢阻挡
2楼-- · 2019-03-08 16:07

To set logical focus to an input control

FocusManager.SetFocusedElement(this, textboxJack);     // set logical focus

To set keyboard focus to an input control

Keyboard.Focus(textboxJill);                             // set keyboard focus

To know the difference between logical and keyboard focus

Input Overview - Focus on MSDN

查看更多
看我几分像从前
3楼-- · 2019-03-08 16:09
Textbox.Focus();

this will focus on the textbox

查看更多
何必那么认真
4楼-- · 2019-03-08 16:11

Your problem can be solved by using a separate focus scope for your "keyboard". Just apply the following property to the control that contains all of your buttons and then they will be in a separate focus scope and will not have the focus set to them when clicked

FocusManager.IsFocusScope="True"
查看更多
闹够了就滚
5楼-- · 2019-03-08 16:15

I wanted to do the same thing, but nothing seemed to work for me. I really needed an answer that worked purely in XAML as I'm working with MVVM.

I finally found this example: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

and modified it to this:

In the 'Resources' section:

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

In my grid definition:

<Grid Style="{StaticResource FocusTextBox}" />
查看更多
再贱就再见
6楼-- · 2019-03-08 16:19

I like these do-my-homework-for-me questions; "the requirement states"...priceless. For those who find this via Google, the trick to progmatically moving the cursor in a WPF TextBox is to use the SelectioNStart property.

private void Button_Click(object sender, RoutedEventArgs e)
{
    textBox.Focus();
    textBox.SelectionStart = textName.Text.Length;
}
查看更多
你好瞎i
7楼-- · 2019-03-08 16:19

I had to use this to get my desired result

FocusManager.SetFocusedElement(this, UserNameautoCompleteBox);

Key key = Key.Enter;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
RoutedEvent routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(
    new KeyEventArgs(
        Keyboard.PrimaryDevice,
        PresentationSource.FromVisual(UserNameautoCompleteBox),
        0,
        key) { RoutedEvent = routedEvent }
);
查看更多
登录 后发表回答