56 lines
1.8 KiB
C#
56 lines
1.8 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Windows;
|
|
using System.Windows.Controls.Primitives;
|
|
using System.Windows.Interop;
|
|
|
|
namespace BeWo.View.Controls
|
|
{
|
|
public class PopupNonTopmost : System.Windows.Controls.Primitives.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 args)
|
|
{
|
|
(obj as PopupNonTopmost).UpdateWindow();
|
|
}
|
|
|
|
protected override void OnOpened(EventArgs e)
|
|
{
|
|
UpdateWindow();
|
|
}
|
|
|
|
private void UpdateWindow()
|
|
{
|
|
var hwnd = ((HwndSource)PresentationSource.FromVisual(Child)).Handle;
|
|
RECT rect;
|
|
|
|
if (GetWindowRect(hwnd, out rect))
|
|
{
|
|
SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int) Width, (int) Height, 0);
|
|
}
|
|
}
|
|
|
|
[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.dll", EntryPoint = "SetWindowPos")]
|
|
private static extern int SetWindowPos(IntPtr hWnd, int hwndsertAfter, int x, int Y, int cx, int cy, uint uFlags);
|
|
}
|
|
} |