How to fix the WPF form resize - controls lagging behind and black background?
wpf
Solution
This is complete working code based on Wieser Software Ltd's 2nd solution.
public partial class MainView : Window
{
public MainView()
{
InitializeComponent();
//ensure win32 handle is created
var handle = new WindowInteropHelper(this).EnsureHandle();
//set window background
var result = SetClassLong(handle, GCL_HBRBACKGROUND, GetSysColorBrush(COLOR_WINDOW));
}
public static IntPtr SetClassLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
//check for x64
if (IntPtr.Size > 4)
return SetClassLongPtr64(hWnd, nIndex, dwNewLong);
else
return new IntPtr(SetClassLongPtr32(hWnd, nIndex, unchecked((uint)dwNewLong.ToInt32())));
}
private const int GCL_HBRBACKGROUND = -10;
private const int COLOR_WINDOW = 5;
[DllImport("user32.dll", EntryPoint = "SetClassLong")]
public static extern uint SetClassLongPtr32(IntPtr hWnd, int nIndex, uint dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetClassLongPtr")]
public static extern IntPtr SetClassLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll")]
static extern IntPtr GetSysColorBrush(int nIndex);
}
Problem
I have a very simple WPF window - the only thing in it is a right-aligned button. When I resize the window by dragging the left boundary, the button jumps around - a lot. Try it yourself, drag the left boundary back and forth. Additionally, a black background becomes exposed temporarily during resizes. In this question, I asked a similar question about Windows Forms. The only answer I got suggested that this is fixed in WPF, however, amazingly, not only is it not fixed, but WPF also adds a second visual bug - the temporary black background. Here's what the control lag looks like; this occurs when I resize the window by its top border (recorded with a camera because screen-cap made it less obvious by making everything slow): Example of the black border: this was captured while resizing the window; it's only like this for a split second but it's very noticeable: Am I doing something wrong? How can I have my controls stay visually in one place during resizes? How can I avoid the black border? Note: the button ends up in the correct place eventually - it only jumps around briefly during the resize.