【问题标题】:send key to TextBox only partial working将密钥发送到 TextBox 仅部分工作
【发布时间】:2017-10-03 14:43:22
【问题描述】:

我有一个自制的“虚拟键盘”。用户可以通过他的键盘或“虚拟键盘”将文本插入TextBox。如果他按下VirtualKey,我将Key 发送到TextBox

TextCompositionManager.StartComposition(new TextComposition(InputManager.Current, _TextBox, key));

如果他按下special Button,我会通过EditingCommands 发送命令。但这只是部分工作。发送Backspace 有效,Tab 无效。 AcceptTab 设置为真。可以通过键盘插入tab,仅模拟此键不起作用。有人给我提示吗?

            case "Back":
                EditingCommands.Backspace.Execute(null, _TextBox);
                break;

            case "Tab":
                EditingCommands.TabForward.Execute(null, _TextBox);
                break;

            case "STab":
                EditingCommands.TabBackward.Execute(null, _TextBox);
                break;
            case "Delete":
                EditingCommands.Delete.Execute(null, _TextBox);
                break;
  • Backspace 有效
  • TabForward 不工作
  • TabBackward 不工作
  • Delete 有效

编辑:

XAML 代码 HtVirtualKeyboardViewModel

    <Style TargetType="Keyboard:HtVirtualKeyboardViewModel" x:Key="KeyboardLayoutTrimmed">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Keyboard:HtVirtualKeyboardViewModel">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Grid Grid.Column="1" Name="KeyboardGrid" VerticalAlignment="Top">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Border Grid.Column="0" Padding="10" Background="{Extensions:HtThemeInfo Key=ChildWindow_Content_Background}" BorderBrush="{TemplateBinding BorderBrush}">
                            <ScrollViewer BorderThickness="0" MaxHeight="400" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                                <Grid Margin="-2">
                                    <TextBox Name="tb1" Text="{Binding DisplayedText, RelativeSource={RelativeSource TemplatedParent}}" FontSize="{TemplateBinding FontSize}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" TextWrapping="Wrap" Style="{StaticResource KeyboardTextBox}"/>
                                </Grid>
                            </ScrollViewer>
                        </Border>
                        <ContentControl Grid.Row="1" ContentTemplate="{Binding KeyboardLayout, RelativeSource={RelativeSource TemplatedParent}}" />
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

    <Style TargetType="TextBox" x:Key="KeyboardTextBox">
    <Setter Property="Background" Value="#D3D3D3"/>
    <Setter Property="CaretBrush" Value="{Extensions:HtThemeInfo Key=ChildWindow_Border}"/>
    <Setter Property="SelectionBrush" Value="{Extensions:HtThemeInfo Key=ChildWindow_Border}"/>
    <Setter Property="AcceptsTab" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border 
                  Name="Border"
                  Background="{TemplateBinding Background}">
                    <ScrollViewer Margin="2,4,2,4" x:Name="PART_ContentHost"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

预览

【问题讨论】:

  • 还请提供有关 xaml 文件的一些详细信息。您是否为控件提供了 TabIndex 属性?
  • 这里有更多细节。但我知道为什么我有这个问题。如果我点击“标签”按钮,焦点就会丢失!得到答案,见下文

标签: c# wpf sendkeys


【解决方案1】:

问题是,当您单击Button 时,Focus 会丢失。

case "Tab":
    _TextBox.Focus();
    EditingCommands.TabForward.Execute(null, _TextBox);
    break;

再次关注TextBox,然后再发送Command 是解决方案!

工作解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多