从wpf窗口获取文本输入

时间:2012-05-03 10:26:58

标签: wpf keyboard window

我在我的窗口上使用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”...... 我错过了什么吗?有没有办法将数据附加到文本框中? 我知道我可以自己转换数据,但似乎很奇怪没有内置方法可以这样做。

2 个答案:

答案 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事件。