问题 描述:
WPF集成SharpDX,当系统睡眠注销后再次启动,SharpDX绘制的内容失效一片空白。
但是拖动改变窗体尺寸就重新刷新了,可能WPF的窗体尺寸改变后,SharpDX的视窗也随之改变并重新通知显卡绘制内容吧。
所以我在C#的系统唤醒事件里模仿了一个窗体改变事件,主动去触发刷新一下,问题就解决了。
构造函数中:
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
---------------
事件:
#region 系统注销时 SharpDX绘制失效
// 手动刷新
//private void refresh_Click(object sender, RoutedEventArgs e)
//{
//ReAttachSharpDX();
//}
void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
ReAttachSharpDX();
}
void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
ReAttachSharpDX();
}
void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
ReAttachSharpDX();
}
void ReAttachSharpDX()
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
(sender as DispatcherTimer).Stop();
this.Width = this.ActualWidth + 2;
this.Width -= 2;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += new EventHandler(timer2_Tick);
timer.Start();
}
void timer2_Tick(object sender, EventArgs e)
{
(sender as DispatcherTimer).Stop();
this.Width += 2;
this.Width -= 2;
}
#endregion