Frage

Wie kann ich maxlength zu Combobox, die ein Stil angewendet wird, mit.

Danke

War es hilfreich?

Lösung

Wenn DependencyProperty verwenden wir die maxlength des Kombinationsfelds festlegen können ohne Ihre Stil / Vorlage zu ändern.

public class EditableComboBox
{

    public static int GetMaxLength(DependencyObject obj)
    {
        return (int)obj.GetValue(MaxLengthProperty);
    }

    public static void SetMaxLength(DependencyObject obj, int value)
    {
        obj.SetValue(MaxLengthProperty, value);
    }

    // Using a DependencyProperty as the backing store for MaxLength.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MaxLengthProperty = DependencyProperty.RegisterAttached("MaxLength", typeof(int), typeof(EditableComboBox), new UIPropertyMetadata(OnMaxLenghtChanged));

    private static void OnMaxLenghtChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        var comboBox = obj as ComboBox;
        if (comboBox == null) return;

        comboBox.Loaded +=
            (s, e) =>
            {
                var textBox = comboBox.FindChild(typeof(TextBox), "PART_EditableTextBox");
                if (textBox == null) return;

                textBox.SetValue(TextBox.MaxLengthProperty, args.NewValue);
            };
    }
}

Anwendungsbeispiel:

<ComboBox ComboboxHelper:EditableComboBox.MaxLength="50" />

Wo ComboboxHelper ist:

  

xmlns: ComboboxHelper = "clr- Namensraum: yourNameSpace , Montage = Yourassembly "

comboBox.FindChild (...) Methode geschrieben wird hier .

Andere Tipps

Sie können auch die maxlength.If die maxlength doest Änderung den GotFocus oder Loaded-Ereignis des ComboBox verwenden zu viel für die Einstellung während der Laufzeit Sie geladenes Ereignis oder sonst Verwendung GotFocus-Ereignis verwenden können,

<ComboBox Height="30" IsEditable="True" Loaded="ComboBox_Loaded"/>

und in der jeweiligen Veranstaltung ...

   var obj = (ComboBox)sender;
    if (obj != null)
    {
        var myTextBox = (TextBox)obj.Template.FindName("PART_EditableTextBox",obj);
        if (myTextBox != null)
        {
            myTextBox.MaxLength = maxLength;
        }
    }

Sie sind richtig. Es gibt eine maxlength für eine Textbox, aber nicht für eine Combobox. Sie haben eine eigene mit einem Textbox als Vermittler rollen. Hier einige Code:

public int MaxLength {get; set;}
protected override void OnGotFocus(System.Windows.RoutedEventArgs e)
{
    base.OnGotFocus(e);
    TextBox thisTextBox = (TextBox)base.GetTemplateChild("PART_EditableTextBox");
    if (thisTextBox != null)
        thisTextBox.MaxLength = MaxLength;
}

Diese Textbox kommt null. Der Stil ist wie folgt gegeben.

<ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="{Binding Path=(local:ToggleComboBox.Width),
                     RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}}" />
            </Grid.ColumnDefinitions>
            <Border x:Name="Border" 
                    Grid.Column="1"
                    CornerRadius="2"
                    Background="#CCFFCC"
                    BorderBrush="#000080"
                    BorderThickness="4" />

            <Border Grid.Column="0"
                    CornerRadius="8,8,8,8" 
                    Margin="0" 
                    Background="#CCFFCC" 
                    BorderBrush="#000080"
                    BorderThickness="4,4,4,4" />

            <Image x:Name="Arrow"
                   Grid.Column="1"     
                   Source="Arrow.png" Margin="4,4,4,4"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource DarkBrush}" />
            </Trigger>
            <Trigger Property="ToggleButton.IsChecked" Value="true">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
                <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
                <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                <!--<Setter TargetName="Arrow" Property="Fill" Value="{StaticResource DisabledForegroundBrush}" />-->
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="TextBox">
        <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}" />
    </ControlTemplate>


    <Style x:Key="ComboBoxStyle" TargetType="ComboBox">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="MinWidth" Value="120"/>
        <Setter Property="MinHeight" Value="20"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ComboBox">
                    <Grid>
                        <ToggleButton Name="ToggleButton" 
                                      Template="{StaticResource ComboBoxToggleButton}" 
                                      Grid.Column="2" 
                                      Focusable="false"
                                      IsChecked="{Binding Path=IsDropDownOpen,
                                                          Mode=TwoWay,
                                                          RelativeSource={RelativeSource TemplatedParent}}"
                                      ClickMode="Press"/>

                        <ContentPresenter Name="ContentSite"
                                          IsHitTestVisible="False" 
                                          Content="{TemplateBinding SelectionBoxItem}"
                                          ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                          ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                                          Margin="9,2,28,2"
                                          VerticalAlignment="Center"
                                          HorizontalAlignment="Left" />

                        <TextBox x:Name="PART_EditableTextBox"
                                 Style="{x:Null}" 
                                 Template="{StaticResource ComboBoxTextBox}" 
                                 HorizontalAlignment="Left" 
                                 VerticalAlignment="Center" 
                                 Margin="3,3,23,3"
                                 Focusable="True" 
                                 Background="Transparent"
                                 Visibility="Hidden"
                                 IsReadOnly="{TemplateBinding IsReadOnly}"/>

                        <Popup Name="Popup"
                               Placement="Bottom"
                               IsOpen="{TemplateBinding IsDropDownOpen}"
                               AllowsTransparency="True" 
                               Focusable="False"
                               PopupAnimation="Slide">

                            <Grid Name="DropDown"
                                  SnapsToDevicePixels="True"             
                                  MinWidth="{TemplateBinding ActualWidth}"
                                  MaxHeight="{TemplateBinding MaxDropDownHeight}">

                                <Border x:Name="DropDownBorder"
                                        Background="#CCFFCC" 
                                        BorderBrush="#000080"
                                        BorderThickness="2"/>

                                <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                    <ScrollViewer.Resources>
                                        <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">25</sys:Double>
                                    </ScrollViewer.Resources>                                    
                                    <StackPanel IsItemsHost="True" />
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                        <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                            <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                            <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                        </Trigger>
                        <Trigger Property="IsEditable" Value="true">
                            <Setter Property="IsTabStop" Value="false"/>
                            <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemContainerStyle" >
            <Setter.Value>
                <Style TargetType="{x:Type ComboBoxItem}">
                    <Setter Property="FontSize" Value="20" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

Ich habe PreviewKeyDown Ereignis, sehr einfach + Sie Warnung oder etwas zeigen können.
Registrieren Sie das Verfahren unten an deine ComboBox.PreviewKeyDown + = Ereignis,
KeyDown-Ereignis wird nicht ausgelöst, wenn der Benutzer mit Space.

private void ComboBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (ComboBox.Text.Length > 19) // allow max 20 chars
    {
        if (e.Key != Key.Back) // allow removing chars
        {
            e.Handled = true; // block any additional key press if there is more than allowed max
            System.Media.SystemSounds.Beep.Play(); // optional: beep to let user know he is out of space :)
        }
    }
}

fand ich einfache Lösung über XAML. In comboBox Ressourcen können wir Stil für Textbox gesetzt und über Setter Set maxlenth.

<ComboBox Name="comboBox" Width="100" IsEditable="True">
<ComboBox.Resources>
<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="MaxLength" Value="yourValue"></Setter> 
</Style>
</ComboBox.Resources>
</ComboBox>

EDIT: Das funktioniert mit Actipro ComboBox. Für gewöhnlich comboBox diese Arbeit zu machen, haben Sie einen Blick hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top