防止WPF窗口闪烁

我有一个无边框的WPF窗口,需要能够隐藏其中一个控件并同时缩小窗口。

问题是它看起来很糟糕。

这就是我现在正在做的事情:

private void btnShowHideTopBar_Click(object sender, RoutedEventArgs e) { if (commandTopHide == true) { txtblkShowHideTopBar.Text = "Show Top Bar"; commandTopHide = false; myWindow.Left = 1100; myWindow.Width = 180; RSide.Width = new GridLength(0, GridUnitType.Pixel); } else if (commandTopHide == false) { txtblkShowHideTopBar.Text = "Hide Top Bar"; commandTopHide = true; myWindow.Left = 1030; myWindow.Width = 250; RSide.Width = new GridLength(70, GridUnitType.Pixel); } } 

这是慢动作的样子:
窗户闪烁

为了纠正这个问题,我尝试了一些方法。 每个显然只适用于Winforms。
例如,我在Bee Eee上关注此博客文章以禁用绘图和“锁定窗口更新”无济于事。

我也尝试重写WM_PAINT消息, 如本文所示,但是一旦我抓住它,我就不知道如何处理消息。 line base.WndProc(ref msg); 抛出错误“ ‘System.Windows.Window’不包含’WndProc’的定义

当然,该代码适用于Winforms,我正在使用如何在WPF中处理WndProc消息中所述的hwndSource.AddHook方法? )…


由于我的自定义按钮,我的xaml相当庞大,所以我会把它留下来。 这是剩下的:

    lots of stuff...                             

@Walt Ritscher,我不知道’隐藏’列,我只是将它的宽度设置为0.但更大的问题似乎是我需要resize并重新定位包含它的窗口。


@ErnodeWeerd,我已经实现了一个秒表,你可以在这里看到:

  Stopwatch s = new Stopwatch(); string a; string b; string c; s.Start(); myWindow.Left = 1100; s.Stop(); a = s.Elapsed.ToString(); s.Reset(); s.Start(); myWindow.Width = 180; s.Stop(); b = s.Elapsed.ToString(); s.Reset(); s.Start(); RSide.Width = new GridLength(0, GridUnitType.Pixel); s.Stop(); c = s.Elapsed.ToString(); s.Reset(); MessageBox.Show(a + Environment.NewLine + b + Environment.NewLine + c + Environment.NewLine); 

这是结果:
秒表结果

您可以使用带网格的透明窗口(AllowTransparency = True),然后在需要隐藏控件时,可以将控件的可见性设置为折叠。 窗户没有闪烁,也没有移动,但是那里也没有任何东西,所以你会看到好像你会resize,移动你的窗户。