DoubleBuffered SplitContainer не показывает перетаскиваемый сплиттер
У меня есть SplitContainer, который нуждается в DoubleBuffer-ове для всего элемента управления.
Я попытался сделать это обычным способом, используя приведенный здесь пример Ханса Пассанта, который обычно прекрасно работает.
using System.Windows.Forms;
class BufferedSplit : SplitContainer
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
}
К сожалению, это приводит к странному побочному эффекту: если вы перемещаете сплиттер, он больше не анимирует / обновляет до тех пор, пока вы не отпустите кнопку мыши, что затруднит определение фактического изменения размера элемента управления. Я предполагаю, что это потому, что все перерисовки теперь выполняются за пределами экрана перед отображением в интерфейсе пользователя.
(Этот эффект легче увидеть, если вы установите весь цвет сплита SplitContainer на что-то вроде серого, а затем установите каждую отдельную панель на белый, чтобы вы могли четко видеть сплиттер).
Я попробовал двойную буферизацию только на двух панелях (используя больше магии Ганса), и, хотя, кажется, теперь это показывает, что сплиттер движется правильно, у меня есть несколько других мерцаний на дочерних элементах управления.
public BufferedSplit()
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.OptimizedDoubleBuffer, true);
var objMethodInfo = typeof(Control).GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance);
var objArgs = new object[] { ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.OptimizedDoubleBuffer, true };
objMethodInfo.Invoke(Panel1, objArgs);
objMethodInfo.Invoke(Panel2, objArgs);
}
Могу ли я дважды буферизовать весь элемент управления SplitContainer, а также правильно ли анимировать сплиттер при его перетаскивании?
WPF не вариант!