4

編集可能なComboBoxがあり、長すぎるテキストを追加すると、次のように表示されます。

ここに画像の説明を入力してください

文字列の先頭からテキストボックスを開始するにはどうすればよいですか?

TextBox txt = sender as TextBox;
txt.Text = "[Children]";

    <Style TargetType="TextBox">
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="BorderBrush" Value="Silver"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBoxBase}">
                    <Border Name="Border" Padding="1" Background="#FFFFFF" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
                        <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="Border" Property="Background" Value="#EEEEEE"/>
                            <Setter TargetName="Border" Property="BorderBrush" Value="#EEEEEE"/>
                            <Setter Property="Foreground" Value="#888888"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

コンボボックス:

ComboBox cmbValue1 = new ComboBox();
cmbValue1.IsTextSearchEnabled = false;
cmbValue1.IsEditable = true;
cmbValue1.Width = 70;
TextBox txtEdit = (TextBox)((sender as ComboBox).Template.FindName("PART_EditableTextBox", (sender as ComboBox)));
txtEdit.Tag = selection;
4

1 に答える 1

0

ユーザーが何かを入力したら、「左揃え」にするために、選択開始を 0 に戻す必要があります。

イベントを介してこれを行いTextBoxBase.PreviewLostKeyboardFocusます-ここにいくつかのXAMLがあります:

 <ComboBox Name="ComboBox1"
           IsEditable="True" 
           TextBoxBase.PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus_1">

そしてイベント自体:

private void TextBox_PreviewLostKeyboardFocus_1(object sender, KeyboardFocusChangedEventArgs e)
{
    TextBox txtEdit = (TextBox)((sender as ComboBox).Template.FindName("PART_EditableTextBox", (sender as ComboBox)));
    txtEdit.SelectionStart = 0;
}

これで、アプリケーションに適応するのに十分なはずだと思います。空の WPF アプリでテストしましたが、TAB を押すか、UI の別の部分をマウスでクリックしても機能します。

編集:

コードでイベントを追加する方法は次のとおりです。

あなたのアプリがどのように構成されているかわかりませんが、これも私にとってはうまくいきます:

private void Window_Initialized_1(object sender, EventArgs e)
{
    ComboBox cmbValue1 = new ComboBox();
    cmbValue1.IsTextSearchEnabled = false;
    cmbValue1.IsEditable = true;
    cmbValue1.Width = 70;
    cmbValue1.PreviewLostKeyboardFocus += TextBox_PreviewLostKeyboardFocus_1;

    this.MyCanvas.Children.Add(cmbValue1);
}

(この回答で上に投稿したのと同じイベントハンドラーを使用)

編集:

作業中のプロジェクトへのリンクは次のとおりです。 注 - フォーカスを失ったとき (つまり、何かを入力した後、または単に選択を解除した後)、編集可能な ComboBox 内のテキストが選択されていない場合に機能します。私はそれを修正しようとします。

http://23.23.250.9/wpfresource.zip
于 2013-03-20T12:03:33.377 に答える