仅部分工作将密钥发送到 TextBox
send key to TextBox only partial working
我有一个自制的"virtual keyboard"。用户可以通过键盘或 "virtual keyboard" 将文本插入 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>
预览
问题是,当您单击 Button
时 Focus
丢失了。
case "Tab":
_TextBox.Focus();
EditingCommands.TabForward.Execute(null, _TextBox);
break;
再次关注TextBox
,发送前Command
是解决方案!
工作解决方案
我有一个自制的"virtual keyboard"。用户可以通过键盘或 "virtual keyboard" 将文本插入 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>
预览
问题是,当您单击 Button
时 Focus
丢失了。
case "Tab":
_TextBox.Focus();
EditingCommands.TabForward.Execute(null, _TextBox);
break;
再次关注TextBox
,发送前Command
是解决方案!