2008-12-15 2 views

Répondre

1

Je ne pense pas qu'il y ait un moyen facile de contourner cela. Le code ci-dessous est copié à partir du code désassemblé de la classe ComboBox. Comme vous pouvez le voir, il se ferme toujours lorsque hasFocus est faux. Je ne pense pas qu'il y ait moyen de contourner cela. Écrire votre propre ComboBox est une solution.

private void FocusChanged(bool hasFocus) 
{ 
    this.UpdateSelectionBoxHighlighted(); 
    base.SetValueInternal(IsSelectionActiveProperty, hasFocus, true); 
    if (!hasFocus) 
    { 
     this.IsDropDownOpen = false; 
    } 
} 
2

Eh bien, en regardant le code désassemblé il ressemble

protected override void OnLostFocus(RoutedEventArgs e) { base.OnLostFocus(e); this.FocusChanged(this.HasFocus()); }

est un bon candidat pour écrasant.

Il n'y a aucun moyen de résoudre votre problème sans implémenter votre propre sous-classe de contrôle.

J'ai fait de même pour avoir un ComboBox avec un Popup qui ne se ferme pas lorsque je sélectionne un élément (je veux avoir un comportement de multi-sélection).

Si quelqu'un est intéressé, voici mes cours (fonctionne très bien pour moi comme il est):

public class ComboBoxWithMultiSelect : ComboBox 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (base.IsDropDownOpen && 
       (e.Key == Key.Enter || 
       e.Key == Key.Space)) 
     { 
      e.Handled = true; 
     } 
     else 
     { 
      base.OnKeyDown(e); 
     } 
    } 

    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new ComboBoxItemWithMultiSelect(); 
    } 
} 


public class ComboBoxItemWithMultiSelect : ComboBoxItem 
{ 
    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     if (e == null) 
     { 
      throw new ArgumentNullException("e"); 
     } 
     if (!e.Handled) 
     { 
      e.Handled = true; 
     } 
    } 
}