3

ウィンドウで 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);
        }

問題は、バッファに適用されるデータが「4」ではなく「NumPad4」であり、「3」ではなく「D3」であることです...何か不足していますか? テキストボックスに入力されたかのようにデータを追加する方法はありますか? 私は自分でデータを変換できることを知っていますが、そうする方法が組み込まれていないのは奇妙に思えます。

4

2 に答える 2

2

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);
}
于 2012-05-03T11:16:48.883 に答える
0

わかりました、これは一見奇妙に思えるかもしれませんが、それが正しい方法だと信じています。から派生し、コンテンツをホストするためにそこにTextBox追加し、そのコンテンツを設定するプロパティを追加しました。ContentPresenterContent

そこで、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

于 2012-05-03T11:06:54.303 に答える