WPF - 将窗口位置锚定到TopLeft以外的位置

时间:2013-01-03 09:51:26

标签: wpf window position anchor

我试图将WPF窗口(不是窗口内的控件)锚定到TopRight,例如,默认情况下Windows会将所有窗口固定在左上角。

我尝试了以下代码

    private void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
    {
        double delta = e.PreviousSize.Width - e.NewSize.Width;
        Left += delta;
    }

它可以工作,但是在快速改变尺寸(例如动画)时窗口会出现断断续续/闪烁的现象

我尝试使用谷歌搜索,但没有找到一个好的解决方案,我错过了什么?

1 个答案:

答案 0 :(得分:0)

我设法在this帖子的帮助下解决了这个问题。

这是代码

public partial class MainWindow : Window
{
    private double right;

    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
        right = Left + Width;
        source.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == (int)WindowMessage.WindowPositionChanging)
        {
            var windowPosition = (WindowPosition)Marshal.PtrToStructure(lParam, typeof(WindowPosition));
            bool isMove = !windowPosition.Flags.HasFlag(WindowPositionFlags.NoMove); //0x0002
            bool isSize = !windowPosition.Flags.HasFlag(WindowPositionFlags.NoSize); //0x0001

            if (isMove)
            {
                right = windowPosition.Left + windowPosition.Width;
            }
            else if (isSize)
            {
                windowPosition.Left = (int)(right - windowPosition.Width);
                windowPosition.Top = (int)Top;
                windowPosition.Flags = (WindowPositionFlags)((int)windowPosition.Flags & 0xfffd); //remove the NoMove flag
                Marshal.StructureToPtr(windowPosition, lParam, true);
            }

        }
        return IntPtr.Zero;
    }

希望它有助于某人