我在我的窗口上使用key_up事件将类型化的数据附加到字符串构建器。
<Grid x:Name="grdMain" KeyUp="grdMain_KeyUp">
<Grid.RowDefinitions>...
private StringBuilder buffer = new StringBuilder();
private void Window_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key != Key.Enter)
{
buffer.Append(e.Key);
}
问题是应用于缓冲区的数据是“NumPad4”而不是“4”和“D3”而不是“3”...... 我错过了什么吗?有没有办法将数据附加到文本框中? 我知道我可以自己转换数据,但似乎很奇怪没有内置方法可以这样做。
答案 0 :(得分:1)
您可以使用TextCompositionManager.TextInput Attached Event。
<Grid x:Name="grdMain"
TextCompositionManager.TextInput="grid_TextInput">
在TextCompositionEventArgs中,您会找到自己想要的内容。
private void grid_TextInput(object sender, TextCompositionEventArgs e)
{
MessageBox.Show(e.Text);
}
答案 1 :(得分:0)
好吧,乍一看这看起来很奇怪,但我相信这是正确的方法。我从TextBox
派生并添加了ContentPresenter
来托管任何内容,并Content
属性来设置该内容。
因此,创建名为TextBoxContainer的WPF自定义控件(它的Visual Studio模板)。添加以下属性:
#region Content (DependencyProperty)
/// <summary>
/// Gets or sets Content property
/// </summary>
public object Content
{
get { return (object)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(object), typeof(TextBoxContainer),
new PropertyMetadata(null));
#endregion
使用以下内容替换Assets / generic.xaml文件中的样式:
<LinearGradientBrush x:Key="TextBoxBorder" EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0">
<GradientStop Color="#ABADB3" Offset="0.05"/>
<GradientStop Color="#E2E3EA" Offset="0.07"/>
<GradientStop Color="#E3E9EF" Offset="1"/>
</LinearGradientBrush>
<Style TargetType="{x:Type local:TextBoxContainer}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TextBoxContainer}">
<Grid>
<Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Microsoft_Windows_Themes:ListBoxChrome>
<ContentPresenter Content="{TemplateBinding Content}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
并使用如下:
<local:TextBoxContainer TextChanged="TextBoxGrid_TextChanged" >
<local:TextBoxContainer.Content>
<Grid>
<!-- Any markup here -->
</Grid>
</local:TextBoxContainer.Content>
</local:TextBoxContainer>
请注意,它随时都有包含所有输入文本的文本。您应该注意的唯一事情是某些元素会阻止某些事件冒泡。例如TextBox
停止KeyDown
事件冒泡。因此,如果您将TextBox
放在TextBoxContainer
内,用户将点击它并开始在那里输入文字 - TextBoxContainer将不会收到该文字,但它会触发TextChanged
事件。