相关疑难解决方法(0)

软件渲染模式 - WPF

我有一个WPF用户控件,我需要强制渲染RenderMode.SoftwareOnly.由于我使用的是.NET 3.5,我不得不做类似的事情,

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

但这不适用于我的应用程序,WPF程序在少数几台机器上崩溃,关闭注册表级别的硬件加速似乎解决了这个问题.

上面的代码是在Loaded窗口的情况下编写的.如果我是正确的,Loaded事件发生在控件呈现后(MSDN).那么在这个事件中有上面的代码是否有意义?如果没有,哪个事件适合它?

此外,RenderMode视觉上的设置会影响它的孩子吗?或者我是否需要为每个子元素专门设置它?

任何帮助都会很棒!

.net c# wpf .net-3.5 hardware-acceleration

16
推荐指数
2
解决办法
2万
查看次数

导致Windows在此WPF功能区应用程序中挂起的原因

我们在一个相当大而复杂的桌面应用程序中遇到了一些问题,其中使用Microsoft Ribbon for WPF(或与此相关的组合)会导致计算机挂起.

下面的简化代码似乎触发了许多计算机上的Windows挂起情况.有些计算机每次都会遇到这种情况,有些人永远不会体验到它.挂起将在某些计算机上使整个会话锁定(包括num lock和大写锁定),但在其他计算机上,鼠标仍会移动(num lock仍然停止运行).当计算机无响应时,远程登录和网络共享似乎仍然有效,但无法结束控制台会话.

简而言之,似乎是行为的根本原因是几件事的结合:

  • 用于WPF的Microsoft功能区
  • 在ElementHost中托管WPF控件的Windows窗体应用程序
  • 使用双缓冲Windows窗体(使用CreateParams)
  • 在WPF功能区上使用软件渲染

我们后来WS_EX_COMPOSITED只使用了几个选定的表单来解决这个问题,但我非常想了解这个问题的根本原因.

我还没有找到一种直接的方法来重现挂起,但这个最小的应用程序似乎通过做一些最大化/恢复并将鼠标悬停在功能区按钮上方来完成业务,至少在某些机器上完成.

以下代码编译为x86 .NET 4.0,针对Microsoft WPF功能区 .NET 4.0库.

using System;
using System.Windows.Forms;
using Microsoft.Windows.Controls.Ribbon;
using System.Windows.Interop;
using System.Windows.Forms.Integration;

namespace WindowsRibbonHang
{
    public class Form1 : Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
                return cp;
            }
        }

        public Form1()
        {
            Ribbon ribbon = new Ribbon();

            RibbonTab tab = new RibbonTab { Header = …
Run Code Online (Sandbox Code Playgroud)

.net wpf ribbon wpf-controls winforms

8
推荐指数
1
解决办法
1110
查看次数