WPF: Как закрыть <Popup>, когда находится за пределами действия прокрутки колесика прокрутки - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно решение о закрытии всплывающего окна, когда внешнее колесо прокрутки прокрутки изменилось.

<ScrollViewer>
    ....
    <Grid>
        <TextBox x:Name="PART_Text"/>
        <Popup IsOpen="{Binding IsDropDown}" StayOpen="False" 
               PlacementTarget{BInding ElementName=PART_Text">
            <Border>...</Border>
        </Popup>
    </Grid>
</ScrollViewer>

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

1 Ответ

0 голосов
/ 27 февраля 2020

Совет на будущее: вам больше повезет, если вы получите ответы на вопросы, если вам будет проще. Ваш код не компилируется из-за того, что: 1) ваше свойство StaysOpen написано с ошибкой, 2) в настройке PlacementTarget нет оператора присваивания и открывающей цитаты, 3) ваше ключевое слово Binding написано с заглавной буквы и 4 ) сеттер не имеет закрывающей скобки.

Чтобы ответить на ваш вопрос, все, что вам нужно сделать, это добавить обработчик команды для события PreviewMouseWheel. То, где вы перехватываете событие, зависит от того, какое поведение вы хотите; если вы хотите, чтобы это происходило, когда любой элемент управления в вашем приложении имеет фокус, добавьте его в MainWindow, в противном случае добавьте его в ScrollViewer:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

<ScrollViewer>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseWheel">
            <i:InvokeCommandAction Command="{Binding PreviewMouseWheelCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

Затем добавьте обработчик команд для него обратно в модель представления:

    private ICommand _PreviewMouseWheelCommand;
    public ICommand PreviewMouseWheelCommand => this._PreviewMouseWheelCommand ?? (this._PreviewMouseWheelCommand = new RelayCommand(OnPreviewMouseWheel));

    private void OnPreviewMouseWheel()
    {
        this.IsDropDown = false;
    }

Пока ваше свойство IsDropDown поддерживает INP C, всплывающее окно будет исчезать всякий раз, когда происходит событие PreviewMouseWheel.

...