Вот что мы сделали:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (ForceSoftwareRendering)
{
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;
}
}
Для нас это работало нормально, КРОМЕ ... Это нужно делать для каждого окна. В .NET 3.5 не было никакого способа заставить настройку вступить в силу во всем приложении. И есть некоторые окна, над которыми у вас не будет такого большого контроля - например, щелкните правой кнопкой мыши «контекстные» окна. Мы обнаружили, что для .NET 3.5 не было хорошего решения, кроме параметра реестра.
Отредактировано
Вот логика, которую мы использовали, чтобы определить, когда форсировать рендеринг программного обеспечения. Это было предложено инженером службы поддержки Microsoft.
public bool ForceSoftwareRendering
{
get
{
int renderingTier = (System.Windows.Media.RenderCapability.Tier >> 16);
return renderingTier == 0;
}
}
В .NET 4 Microsoft добавила настройку для всего приложения, которая идеально подходит для нас. Это гораздо лучший вариант, потому что вам не нужно устанавливать его в каждом окне. Вы просто устанавливаете его один раз, и он применяется ко всем окнам.
http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode(VS.100).aspx
Отредактировано
Новое свойство .NET 4.0 может быть установлено при запуске приложения следующим образом:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (ForceSoftwareRendering)
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}