Как сделать так, чтобы раскрывающийся список WPF Combobox оставался открытым и размещался - PullRequest
3 голосов
/ 17 марта 2011

Я хочу, чтобы Combobox редактировался, а выпадающий список оставался открытым.

В настоящий момент с этими свойствами установлены:

IsEditable="True" IsDropDownOpen="True" StaysOpenOnEdit="True" 

Всякий раз, когда пользователь нажимает на текстовое поле ввода или фокус изменяется на другие элементы управления, dorpdown закрывается.Поэтому я обновил шаблон (включенный в WPF Theme : BureauBlue), чтобы в этом конкретном случае Popup IsOpen="true" оставил раскрывающийся список, но теперь, когда пользователь перетаскивает и перемещает позицию окна,выпадающий список не автоматически обновляет свою позицию, а остается в старой позиции.

Как я могу сделать так, чтобы он автоматически обновлял свою позицию, пока он открыт ?

1 Ответ

7 голосов
/ 17 марта 2011

Вы можете использовать описанный здесь трюк: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/27950e73-0007-4e0b-9f00-568d2db1d979

Я создал Смешанное поведение , которое облегчает использование с любым всплывающим окном:

/// <summary>
/// A behavior that forces the associated popup to update its position when the <see cref="Popup.PlacementTarget"/>
/// location has changed.
/// </summary>
public class AutoRepositionPopupBehavior : Behavior<Popup> {
    public Point StartPoint = new Point(0, 0);
    public Point EndPoint = new Point(0, 0);

    protected override void OnAttached() {
        base.OnAttached();

        if (AssociatedObject.PlacementTarget != null) {
            AssociatedObject.PlacementTarget.LayoutUpdated += OnPopupTargetLayoutUpdated;
        }
    }

    void OnPopupTargetLayoutUpdated(object sender, EventArgs e) {
        if (AssociatedObject.IsOpen) {
            ResetPopUp();
        }
    }

    public void ResetPopUp() {
        // The following trick that forces the popup to change it's position was taken from here:
        // http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/27950e73-0007-4e0b-9f00-568d2db1d979
        Random random = new Random();
        AssociatedObject.PlacementRectangle = new Rect(new Point(random.NextDouble() / 1000, 0), new Size(75, 25));
    }
}

Вот пример того, как применить поведение:

<Popup ...>
    <i:Interaction.Behaviors>
        <Behaviors:AutoRepositionPopupBehavior />
    </i:Interaction.Behaviors>
</Popup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...