2011-01-07 3 views
2

위치 속성을 변경하는 값을 할당 할 때마다 윈도우의 위치가 바뀌므로 Left, Top, Width, Height 속성 할당 대신 Windows.Forms에서 SetBounds 메서드를 사용했습니다. Left, Top, Width, Height 지정은 윈도우가 SetBounds가 한 번 이동하는 동안 윈도우를 4 번 움직이게합니다 (더 나은 UI 경험, 윈도우 머뭇 거림 없음).WPF : Window SetBounds

WPF로 마이그레이션 할 때 SetBounds 메서드가없고 창 크기와 위치를 단계적으로 변경해야하는 것처럼 보입니다.

한 창에서 WPF 창 위치를 변경하는 가장 좋은 방법은 무엇입니까?

답변

5

SetBounds는 WPF에서 사용할 수 없습니다,하지만 당신은 쉽게 P /는 SetWindowPos API 호출 할 수 있습니다 다음 Left, Top, WidthHeight 종속성 속성이 자동으로 새로운 경계를 반영하기 위해 업데이트됩니다

private IntPtr _handle; 
    private void SetBounds(int left, int top, int width, int height) 
    { 
     if (_handle == IntPtr.Zero) 
      _handle = new WindowInteropHelper(this).Handle; 

     SetWindowPos(_handle, IntPtr.Zero, left, top, width, height, 0); 
    } 

    [DllImport("user32")] 
    static extern bool SetWindowPos(
     IntPtr hWnd, 
     IntPtr hWndInsertAfter, 
     int x, 
     int y, 
     int cx, 
     int cy, 
     uint uFlags); 

합니다.

+3

감사합니다. @ 토마스! WPF의 아버지가 SetBounds 메서드를 버렸습니다. Windows 위젯에서 우리를 추상화하기 위해 개발 된 멋진 기술에 더러운 해킹을 적용해야한다는 것은 거의 믿을 수없는 일입니다. –

관련 문제