按下按钮

时间:2015-08-21 08:30:00

标签: c# wpf xaml mvvm binding

我在用户控件中有以下文本框。

<!-- This is the user input TextBox, users type commands here and hit enter or press the send command button -->
<TextBox Text="{Binding CommandText}" Background="Transparent" BorderBrush="{StaticResource brushWatermarkBorder}" Name="txtUserEntry">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding BindKeyCommand}"
                CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}"
                Key="Return"
                Modifiers=""/>
    </TextBox.InputBindings>
</TextBox>

和按钮。

<!-- This button serves as an alternative to hitting the enter key with text box focus. -->
<Button Command="{Binding BindKeyCommand}"  CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}" Grid.Column="2">
    <TextBlock>
                Send Command
    </TextBlock>
</Button>

当用户键入框并使用返回键也发送命令时,命令将成功通过BindKeyCommand发送(弹出一个消息框以确认此信息)并在文本框中保留焦点。

但是,当使用Button发送命令时,该命令再次成功,但对文本框的关注将丢失。

我试图实施答案here,但都无济于事。有人可以向我解释一下,如何正确地实现这里的答案,包括放在视图模型中的内容,或者,另一种方法是,在按下按钮时,键盘焦点被分配回文本框。重要的是要注意,就像在链接的问题中一样,我正在使用MVVM。

更新:尝试通过DT Sawant执行步骤

第1步:

ApplicationName.Tools.FocusExtension包含排名第二的答案中的所有文本。扩展名在ApplicationName.Tools命名空间

第2步:

添加了新属性;

private bool isTxtUserEntryFocused = false;
public bool IsTxtUserEntryFocused
{
    get
    {
       return isTxtUserEntryFocused;
    }
        set
        {
            isTxtUserEntryFocused = value;
            OnPropertyChanged("IsTxtUserEntryFocused");
        }
    }

第3步:

添加了命名空间参考; xmlns:Tools =“clr-namespace:WPFLocalDataConnect.Tools”

第4步:

绑定IsFocused属性;工具:FocusExtension.IsFocused =“{Binding IsTxtUserEntryFocused}”

第5步:

因此在viewmodel中初始化;

        public void ExecuteBindKeyCommand(string param)
    {
        if (String.IsNullOrWhiteSpace(param))
        {
            MessageBox.Show("No command given.");
            this.CommandText = string.Format("");
            IsTxtUserEntryFocused = true;
        }
        else
        {
            MessageBox.Show(string.Format("CommandInvoked: {0}", param));
            History = string.Format("{0} {2} {1}", History, param, Environment.NewLine);
            this.CommandText = string.Format("");
            IsTxtUserEntryFocused = true;
        }
    }

现在所有步骤都已完成我测试了项目。它没有用,但需要注意一些有趣的事情;

按下按钮而不首先聚焦文本框会导致“无命令”消息,然后焦点移动到文本框。单击文本框后按下按钮,输入或不输入文本分别导致“无命令”或“命令调用”消息,然后没有焦点移动到文本框。这太令人困惑了。

2 个答案:

答案 0 :(得分:0)

您可以在后面的代码中执行类似的操作来设置焦点

 <Button Click="MyButton_Click" Name="MyButton" Command="{Binding BindKeyCommand}"  CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}" Grid.Column="2" >
<TextBlock>
            Send Command
</TextBlock>

 private void MyButton_Click(object sender, RoutedEventArgs e)
    {
         Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => txtUserEntry.Focus()));
    }

答案 1 :(得分:0)

你试图在帮助下解决你的问题  this链接。我将解释实现相同解决方案的步骤:

步骤1:添加上面链接中给出的新类FocusExtension。

第2步:在viewmodel中添加新属性IsTxtUserEntryFocused(您可以提供任何名称)

步骤3:在XAML中添加FocusExtension类的命名空间引用

步骤4:将FocusExtension类的IsFocused属性绑定到viewmodel属性。 如下图所示:

<TextBox local:FocusExtension.IsFocused="{Binding IsTxtUserEntryFocused}" /> 

步骤5:现在在您的按钮命令中,您可能已在视图模型中实现了该命令。 初始化

IsTxtUserEntryFocused=true.

由于您的显示消息框,焦点不会保留在文本框上。 所以焦点转到消息框,它不会回到你的窗口。

您应该在显示消息框后添加此行

 Application.Current.MainWindow.Focus();//Bring focus to your window where text box is present

那就是它。