在wpf应用程序中将弹出窗口移到屏幕外

在wpf应用程序中将弹出窗口移到屏幕外,wpf,popup,Wpf,Popup,VerticalOffset的最大值是监视器边框,如何将弹出窗口移出屏幕?假设一个弹出窗口要显示在屏幕右角并显示模拟时钟,请从屏幕外输入 我想将弹出窗口移出屏幕,并在需要时输入。您需要将IsOpen绑定到某个对象。就像你绑定PlacementTarget一样。我强烈建议您使用视图模型,以便可以绑定到数据。您可以通过设置窗口的DataContext属性来实现这一点。您可以在视图模型中有一个名为IsValid的字段,它是一个bool,那么您的XAML将如下所示 <Popup Name="myP

VerticalOffset
的最大值是监视器边框,如何将
弹出窗口
移出屏幕?假设一个
弹出窗口
要显示在屏幕右角并显示
模拟时钟
,请从屏幕外输入


我想将
弹出窗口
移出屏幕,并在需要时输入。

您需要将IsOpen绑定到某个对象。就像你绑定PlacementTarget一样。我强烈建议您使用视图模型,以便可以绑定到数据。您可以通过设置窗口的DataContext属性来实现这一点。您可以在视图模型中有一个名为IsValid的字段,它是一个bool,那么您的XAML将如下所示

<Popup Name="myPopup2" IsOpen="{Binding IsValid}" PlacementTarget="{Binding ElementName=mainCanvas}" Width="100" Height="100" Placement="Top" Margin="200">


如果您实现INotifyPropertyChanged,您可以监视视图模型中的内容,如文本字段等,并查看用户是否输入了正确的信息等。您可能可以通过其他方式完成此操作,但我建议您使用视图模型并将IsOpen绑定到它将是最佳解决方案

在wpf框架上无法将弹出窗口移出屏幕,但您可以通过p/invoke调用“SetWindowPos”来强制弹出位置:

#region P/Invoke imports & definitions

        private const int HWND_TOPMOST = -1;
        private const int HWND_NOTOPMOST = -2;
        private const int HWND_BOTTOM = 1;
        private const int SWP_NOMOVE = 0x0002;
        private const int SWP_NOSIZE = 0x0001;
        private const int SWP_NOACTIVATE = 0x0010;
        private const int GW_HWNDPREV = 3;
        private const int GW_HWNDLAST = 1;


  [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
        private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags); 

 #endregion

 private void updateposition(Item item)
        {
            if (item.IsOpen)
            {
                IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(item.popup.Child)).Handle;
                SetWindowPos(hwnd, 0, (int)item.WorkPoint.X, (int)item.WorkPoint.Y, (int)item.popup.Width, (int)item.popup.Height, SWP_NOSIZE | SWP_NOACTIVATE);

            }


        }

谢谢@Kenn,但主要问题不是打开或关闭弹出窗口,主要问题是将弹出窗口移出屏幕!