22

でレンダリングを強制する必要がある WPF ユーザー コントロールがありますRenderMode.SoftwareOnly。私は.NET 3.5を使用しているので、次のようなことをしなければなりませんでした:

var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
if (hwndSource != null)
{
    hwndSource.CompositionTarget.RenderMode = RenderMode.SoftwareOnly;        
}

しかし、これは私のアプリケーションでは機能しません.WPFプログラムはいくつかのマシンでクラッシュし、レジストリレベルでハードウェアアクセラレーションをオフにすると問題が解決するようです.

上記のコードはLoaded、ウィンドウのイベントで記述されています。私が正しければLoaded、コントロールがレンダリングされた後にイベントが発生します( MSDN )。そのイベントで上記のコードを使用することは理にかなっていますか? そうでない場合、どのイベントがそれに適していますか?

また、RenderModeビジュアルの設定はその子に影響しますか? または、子要素ごとにこれを具体的に設定する必要がありますか?

4

3 に答える 3

35

行ったことは次のとおりです。

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 の適切な解決策がないことがわかりました。

編集済み

ソフトウェア レンダリングを強制するタイミングを決定するために使用したロジックを次に示します。これは、マイクロソフトのサポート エンジニアによって提案されました。

public bool ForceSoftwareRendering 
{
    get 
    { 
        int renderingTier = (System.Windows.Media.RenderCapability.Tier >> 16);
        return renderingTier == 0;
    }
}

.NET 4 では、Microsoft は、私たちにとって完璧に機能するアプリケーション全体の設定を追加しました。すべてのウィンドウに設定する必要がないため、はるかに優れたオプションです。一度設定するだけで、すべてのウィンドウに適用されます。

System.Windows.Media.RenderOptions.ProcessRenderMode

編集済み

新しい .NET 4.0 プロパティは、アプリケーションの起動時に次のように設定できます。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        if (ForceSoftwareRendering)
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
    }
}
于 2011-02-09T22:23:05.610 に答える
24

アプリケーションの起動ハンドラに次の行を追加することで、プロセス全体のハードウェア レンダリングを無効にすることもできます。

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

実行中に切り替えることも可能

于 2012-06-13T09:32:00.293 に答える
3

event -problem
不足している hwnd-source については、次のことを試してください。

    Dispatcher.BeginInvoke(new Action(delegate {               
       HwndSource hwndSource = PresentationSource.FromVisual(this) as System.Windows.Interop.HwndSource;
            if (null == hwndSource) {
                throw new InvalidOperationException("No HWND");
            }
            HwndTarget hwndTarget = hwndSource.CompositionTarget;
            hwndTarget.RenderMode = RenderMode.SoftwareOnly;

  }),System.Windows.Threading.DispatcherPriority.ContextIdle, null);

私の知る限り、WPF
ウィンドウごとに Win32 ウィンドウは 1 つだけで、残りはすべて WPF でネイティブにレンダリングされます。そのため、設定はビジュアルが含まれていたウィンドウ内のすべてのコンテンツに関係すると思いますRenderMode。この場合、スコープはウィンドウ全体です。

于 2011-02-09T22:32:44.393 に答える