VerticalOffset
的最大值是监视器边框,如何将Popup
移出屏幕?假设Popup
想要显示在屏幕的右上角并显示Analog Clock
,请从屏幕外输入。
我想将Popup
从屏幕中移出并在需要时输入。
答案 0 :(得分:0)
你需要将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将是最好的解决方案。
答案 1 :(得分:0)
wpf框架无法将Popup置于屏幕之外,但您可以通过调用&#34; SetWindowPos&#34;来强制弹出位置。通过p / invoke:
#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);
}
}