日期:2014-05-17  浏览次数:21675 次

WPF,如何让窗体保持比例地改变尺寸
WPF,如何让窗体保持比例地改变尺寸,就是用鼠标改变窗体尺寸的时候,宽、高自动保持比例。
网上有些方法,窗体会有闪烁情况。
你有更好的方法没呢?

------解决方案--------------------
估计你在网上找的方法是捕捉每一次鼠标拖动事件。这样系统会来不及反应,那是肯定会闪的。

建议你设置当鼠标放开后才修改窗体大小,或者是设置一个定时器,鼠标拖动事件发生时,或者OnResize事件发生时计数,当计数达到某个值时才修改窗体尺寸。

int count=0;
Window_OnResize(s,e){
  count++;
  if(count % 100 ==0){
    //修改窗体
  }
}
------解决方案--------------------
估计下面的代码你看过.贴出来大家讨论一下.

要是想要恒定比例的话, 这个实现起来本来就有些困难,因为WPF 窗口的 border是win32的有些难控制,这里有个例子是当你改变宽度的时候同时维持高度:
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        this.Width = 400;
        this.Height = this.Width * 0.618;
    }
        
    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource source = HwndSource.FromVisual(this) as HwndSource;
        if (source != null)
        {
            source.AddHook(new HwndSourceHook(WinProc));
        }
    }

    public const Int32 WM_EXITSIZEMOVE = 0x0232;
    private IntPtr WinProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, ref Boolean handled)
    {
        IntPtr result = IntPtr.Zero;
        switch (msg)
        {
            case WM_EXITSIZEMOVE:
                {
                    this.Height = this.Width * 0.618;
                    break;
                }
        }

        return result;
    }

}

还有一个方法就是override OneRednerSizeChanged事件:

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    var percentWidthChange = Math.Abs(sizeInfo.NewSize.Width&