2009-10-15 21 views

Antwort

19

Wenn DependencyProperty verwenden, können wir die maxlength des Kombinationsfelds festlegen, ohne 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- Namespace: yourNameSpace; Montage = Yourassembly"

comboBox.FindChild (...) Methode wird gepostet here.

+0

Vielen Dank Tri Q .. Einmal wieder danke. – Ershad

2

Sie haben Recht. Es gibt eine maximale Länge für eine Textbox, aber nicht für eine Combobox. Sie müssen Ihre eigenen rollen mit einer Textbox als Vermittler. Hier ist ein 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; 
} 
0

Diese TextBox kommt null. Der angegebene Stil ist wie folgt.

<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> 
7

Oder können Sie das GotFocus oder Loaded-Ereignis des ComboBox verwenden, um den maxlength.If die maxlength zur Einstellung doest zu viel ändern während der Laufzeit können Sie geladenes Ereignis verwenden oder sonst GotFocus-Ereignis

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

und in der Anwendung entsprechendes Ereignis ...

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

Ich fand einfache Lösung über XAML. In den comboBox-Ressourcen können wir den Stil für die Textbox und über das Set-Set maxlenth festlegen.

<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: Dies funktioniert mit Actipro ComboBox. Für gewöhnliche ComboBox, um diese Arbeit zu machen, werfen Sie einen Blick here

-2

Ich PreviewKeyDown Ereignis verwendet, sehr einfach + Sie können Warnung oder etwas zeigen.
Registrieren Sie die folgende Methode zu Ihrer ComboBox.PreviewKeyDown + = Ereignis,
KeyDown Ereignis wird nicht ausgelöst, wenn Benutzer Space drücken.

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 :) 
     } 
    } 
}