使用WPF的Popup的時候會發現有一個問題,它總是會置頂,只要Popup的StayOpen不設置為False,它就一直呆在最頂端,擋住其他的窗口。
解決方案是繼承Popup重新定義控件PopupEx。
public class PopupEx : Popup
{
public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(PopupEx ), new FrameworkPropertyMetadata(false, OnTopmostChanged));
public bool Topmost
{
get { return (bool)GetValue(TopmostProperty); }
set { SetValue(TopmostProperty, value); }
}
private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
(obj as PopupEx ).UpdateWindow();
}
protected override void OnOpened(EventArgs e)
{
UpdateWindow();
}
private void UpdateWindow()
{
var hwnd = ((HwndSource)PresentationSource.FromVisual(this).Handle;
RECT rect;
if (GetWindowRect(hwnd, out rect))
{
SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);
}
}
#region imports definitions
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32", EntryPoint = "SetWindowPos")]
private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);
#endregion
}
然后在調用該控件的時候設置該PopupEx的屬性 Topmost=False即可。
還有一個Popup的問題,“在父窗口拖動的時候Popup不隨着父窗口移動”的問題的解決方案我會在下一篇隨筆中給出,敬請期待。
轉載時請注明文章來源:http://www.cnblogs.com/Leaco/p/3164394.html