1

最大值VerticalOffset是显示器边框,怎么可能移到Popup屏幕外?假设一个Popup要在屏幕右上角显示并显示Analog Clock,从屏幕外进入。

我想Popup退出屏幕并在需要时进入。

4

2 回答 2

0

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

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

如果您实现 INotifyPropertyChanged,您可以监控视图模型中的内容,例如文本字段等,并查看用户是否输入了正确的信息等。您可能可以通过其他方式做到这一点,但我会敦促您使用视图模型和绑定IsOpen 将是最好的解决方案。

于 2013-07-26T12:56:48.573 回答
0

wpf 框架无法将 Popup 置于屏幕之外,但您可以通过 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);

            }


        }
于 2017-05-08T21:17:49.083 回答