WPF:如何在外部滚动查看器鼠标滚轮操作时关闭 <Popup>

WPF: How to close <Popup> when outside scrollviewer mousewheel action

我想要一个解决方案,当外部 scrollviewer mousewheel 改变时关闭弹出控制。

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

我想让弹出窗口window在滚轮移动时自动关闭,而不是鼠标单击

未来提示:如果您能让人们轻松地回答问题,您就会有更好的运气。您的代码无法编译是因为 1) 您的 StaysOpen 属性 拼写错误,2) 您的 PlacementTarget 设置没有赋值运算符和开始引号,3) 您的 Binding 关键字大写错误和 4) setter 没有右括号。

要回答您的问题,您需要做的就是为 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 属性 支持 INPC,只要 PreviewMouseWheel 事件发生,弹出窗口就会消失。