Держите Silverlight Combobox DropDown открытым после потери фокуса - PullRequest
3 голосов
/ 15 декабря 2008

Можно ли избежать автоматического краха Silverlight ComboBox после LostFocus?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Ну, глядя на разобранный код, он выглядит как

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

- хороший кандидат на перезапись.

Нет способа решить вашу проблему без реализации собственного подкласса управления.

Я сделал то же самое, чтобы получить ComboBox с Popup, который не закрывается, когда я выбираю элемент (я хочу иметь режим множественного выбора).

Если кому-то интересно, вот мои уроки (у меня работает нормально, как есть):

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;
        }
    }
}
1 голос
/ 16 декабря 2008

Я не думаю, что есть простой способ обойти это. Код ниже скопирован из дизассемблированного кода из класса ComboBox. Как вы можете видеть, он всегда закрывается, когда hasFocus имеет значение false. Я не думаю, что есть способ обойти это. Написание собственного ComboBox - это решение.

private void FocusChanged(bool hasFocus)
{
    this.UpdateSelectionBoxHighlighted();
    base.SetValueInternal(IsSelectionActiveProperty, hasFocus, true);
    if (!hasFocus)
    {
        this.IsDropDownOpen = false;
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...