小编tor*_*ldr的帖子

导致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
查看次数

使用.NET 3.5的Visual Studio 2010项目似乎允许System.Xml中仅可从.NET 4.0获得的方法

我最近在某些机器上遇到了以下异常.

未处理的异常:System.MissingMethodException:找不到方法:'Void System.Xml.Xsl.XslCompiledTransform.Transform(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlWriter,System.Xml.XmlResolver )".

从这个错误可以清楚地看出,我们正在尝试在System.Xml.Xsl.XslCompiledTransform不存在的类上使用方法.

该错误似乎与Windows XP计算机隔离,无论是否存在.NET Framework 4.0,但在我尝试过的Windows 7计算机上都可以运行(所有计算机都有3.5和4.0).

阅读文档,我们可以看到这里使用的签名在.NET 4.0中可用,但不是更早.

在新的.NET 3.5控制台应用程序中使用以下代码,我尝试用几种不同的方式编译项目.

using System;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace SystemXmlTestTool
{
    class Program
    {
    static void Main(string[] args)
    {
        var transform = new XslCompiledTransform();

        try
        {
            transform.Transform((IXPathNavigable)null, null, null, null);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.GetType().Name);
            Console.WriteLine(e.Message);
        }

        Console.ReadKey();
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过运行

C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:clean
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:build
Run Code Online (Sandbox Code Playgroud)

在Windows 7机器上(以及通过Visual Studio 2010进行编译),项目将成功编译.

如果我在Windows XP机器上安装了同样的程序(也安装了.NET Framework 4.0),我会收到编译器警告,告诉我很明显.

这一切归结为的问题是; 为什么Windows 7机器上的Visual Studio 2010/MSBuild(多个)允许我在我的代码中使用此方法,而它不应该出现在.NET Framwork 3.5中?

我怀疑我的环境有问题,但我不知道为什么.

.net c# visual-studio-2010 .net-3.5

3
推荐指数
1
解决办法
606
查看次数

PHP:如何将html标签替换为""?

PHP:如何替换用""替换的HTML标签?

使用以下代码:

$str = 'line1<div>line2</div>line3';
echo strip_tags($str);
Run Code Online (Sandbox Code Playgroud)

我明白了

line1line2line3
Run Code Online (Sandbox Code Playgroud)

但预期的结果是

line1 line2 line3
Run Code Online (Sandbox Code Playgroud)

谢谢

php regex

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

标签 统计

.net ×2

.net-3.5 ×1

c# ×1

php ×1

regex ×1

ribbon ×1

visual-studio-2010 ×1

winforms ×1

wpf ×1

wpf-controls ×1