public class PopupNonTopmost : Popup
{
public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(
typeof( PopupNonTopmost ),
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 PopupNonTopmost ).UpdateWindow();
}
protected override void OnOpened( EventArgs e )
{
UpdateWindow();
}
private void UpdateWindow()
{
var hwnd = ( (HwndSource)PresentationSource.FromVisual( this.Child ) ).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 P/Invoke 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
}