所以我需要通过过程化生成一个网格的背景图像,它只需要0.1秒。
因此,我可以将其接线到SizeChanged事件中,但是当您调整图表大小时,它会触发该事件大约30次每秒,因此调整大小事件会严重延迟。
有人知道一种好的方法来接线到调整大小事件并测试用户是否已完成调整大小吗?我尝试简单地检查鼠标的上/下状态,但是当调整大小事件发生时,鼠标几乎总是按下状态。
所以我需要通过过程化生成一个网格的背景图像,它只需要0.1秒。
因此,我可以将其接线到SizeChanged事件中,但是当您调整图表大小时,它会触发该事件大约30次每秒,因此调整大小事件会严重延迟。
有人知道一种好的方法来接线到调整大小事件并测试用户是否已完成调整大小吗?我尝试简单地检查鼠标的上/下状态,但是当调整大小事件发生时,鼠标几乎总是按下状态。
在调整大小时,你可以启动一个短暂的计时器(例如100毫秒),在每次调整大小时重置该计时器以防止它过期。当最后一次调整大小发生时,计时器将到期,然后你可以绘制背景图像。
示例:
Timer resizeTimer = new Timer(100) { Enabled = false };
public Window1()
{
InitializeComponent();
resizeTimer.Elapsed += new ElapsedEventHandler(ResizingDone);
}
void ResizingDone(object sender, ElapsedEventArgs e)
{
resizeTimer.Stop();
GenerateImage();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
resizeTimer.Stop();
resizeTimer.Start();
}
这里是简洁的解决方案:
private const int WmExitSizeMove = 0x232;
private void OnLoaded(object sender, RoutedEventArgs args)
{
var helper = new WindowInteropHelper(this);
if (helper.Handle != null)
{
var source = HwndSource.FromHwnd(helper.Handle);
if (source != null)
source.AddHook(HwndMessageHook);
}
}
private IntPtr HwndMessageHook(IntPtr wnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case WmExitSizeMove:
// DO SOMETHING HERE
handled = true;
break;
}
return IntPtr.Zero;
}
祝你好运!
private bool _generateImageReqested = false;
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (!_generateImageReqested)
{
_generateImageReqested = true;
Dispatcher.BeginInvoke(new Action(GenerateImage), DispatcherPriority.ApplicationIdle);
}
}
private void GenerateImage()
{
_generateImageReqested = false;
// resize your image here
}