Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MDX/SlimDX会弄乱WPF滚动条吗?_C#_Wpf_Winforms_Interop_Directx - Fatal编程技术网

C# MDX/SlimDX会弄乱WPF滚动条吗?

C# MDX/SlimDX会弄乱WPF滚动条吗?,c#,wpf,winforms,interop,directx,C#,Wpf,Winforms,Interop,Directx,我有一个非常简单的WPF用户控件,它与windows窗体应用程序混合在一起。它有一个列表框,可以在不使用拇指的情况下呈现滚动条(下图)。我把它缩小到应用程序中使用托管DirectX(MDX)的插件。如果我删除插件,滚动条就可以了。我知道MDX被贬低了,但我不认为今天是考虑升级的一天。有没有人见过他们的滚动条被弄乱了,或者知道我该怎么做 我应该补充一点,这个控件也存在于插件中。这两个插件无法相互引用 更新:您可以阅读下面的解决方案。我的建议是去掉您的MDX插件 我已经使用了WPF和MDX,

我有一个非常简单的WPF用户控件,它与windows窗体应用程序混合在一起。它有一个列表框,可以在不使用拇指的情况下呈现滚动条(下图)。我把它缩小到应用程序中使用托管DirectX(MDX)的插件。如果我删除插件,滚动条就可以了。我知道MDX被贬低了,但我不认为今天是考虑升级的一天。有没有人见过他们的滚动条被弄乱了,或者知道我该怎么做

我应该补充一点,这个控件也存在于插件中。这两个插件无法相互引用



更新:您可以阅读下面的解决方案。

我的建议是去掉您的MDX插件

我已经使用了WPF和MDX,虽然不是在同一个项目中。这两个库都与DirectX通信,最终将在本机级别存储状态,这可能会导致问题。使用WPF时,我遇到了与视频驱动程序相关的渲染问题,修复方法是将视频驱动程序升级到新版本

初始化DirectX会影响DirectX(以及您的CPU!)对整个应用程序的执行方式。例如,在默认情况下初始化MDX时,它会将CPU设置为在整个过程中以单精度执行所有浮点计算,而不管您如何声明原始值。正如您可能想象的那样,这在很长一段时间内导致了很多令人挠头的问题,比如为什么我们在应用程序和单元测试中得到了不同的结果

我怀疑当MDX初始化时,它正在启用或禁用图形卡中的某些功能或设置(或者可能是某些软件设置),这些功能或设置会以某种方式影响WPF管道


我希望我能帮上更多的忙。祝你好运。

我的建议是去掉你的MDX插件

我已经使用了WPF和MDX,虽然不是在同一个项目中。这两个库都与DirectX通信,最终将在本机级别存储状态,这可能会导致问题。使用WPF时,我遇到了与视频驱动程序相关的渲染问题,修复方法是将视频驱动程序升级到新版本

初始化DirectX会影响DirectX(以及您的CPU!)对整个应用程序的执行方式。例如,在默认情况下初始化MDX时,它会将CPU设置为在整个过程中以单精度执行所有浮点计算,而不管您如何声明原始值。正如您可能想象的那样,这在很长一段时间内导致了很多令人挠头的问题,比如为什么我们在应用程序和单元测试中得到了不同的结果

我怀疑当MDX初始化时,它正在启用或禁用图形卡中的某些功能或设置(或者可能是某些软件设置),这些功能或设置会以某种方式影响WPF管道


我希望我能帮上更多的忙。祝你好运。

你试过SlimDX而不是MDX吗?是围绕DX的较新包装器,正在积极开发中。也许你可以在SlimDX中做同样的事情,你可以使用你的MDX插件,并且滚动条功能正常


关于WPF和MDX的交互作用,Peter是对的。WPF在内部使用DirectX。因此,更改MDX(或SlimDX)中的设置可以更改WPF的行为方式。您还可以尝试查看WPF滚动条的代码(例如,使用.NET Reflector、IDA,任何您需要的工具),并检查滚动条所依赖的设置。

您尝试过SlimDX而不是MDX吗?是围绕DX的较新包装器,正在积极开发中。也许你可以在SlimDX中做同样的事情,你可以使用你的MDX插件,并且滚动条功能正常


关于WPF和MDX的交互作用,Peter是对的。WPF在内部使用DirectX。因此,更改MDX(或SlimDX)中的设置可以更改WPF的行为方式。您还可以尝试查看WPF滚动条的代码(例如使用.NET Reflector、IDA,无论您需要什么),并检查滚动条所依赖的设置。

我支持先前海报中关于WPF上下文中MDX的保留。然而,在黑暗中的一枪:

您是否已经尝试将您的控件定位到.NET Framework 3.5 SP1?在DirectX/Direct3D的互操作性和性能方面已经做了大量工作,例如:

  • 中的“图形增强”一段
  • 中的“WPF与Direct3D的互操作性”段落

这些改进中的一些可能最终会对您的问题产生积极的副作用。

我支持之前关于WPF环境中MDX的海报中的保留意见。然而,在黑暗中的一枪:

您是否已经尝试将您的控件定位到.NET Framework 3.5 SP1?在DirectX/Direct3D的互操作性和性能方面已经做了大量工作,例如:

  • 中的“图形增强”一段
  • 中的“WPF与Direct3D的互操作性”段落

其中一些增强功能最终可能会对您的问题产生积极的副作用。

我听取了所有人的建议,并将我的应用程序移植到SlimDX。这并不太糟糕(几乎每个类/方法/字段在SlimDX中的名称都与MDX完全相同)。不幸的是,我仍然有同样的问题。我能够将SlimDX和MDX简化为以下应用程序:

public partial class MainForm : Form
{
    Direct3D Direct3D = new Direct3D();
    Panel slimPanel = new Panel();

    public MainForm()
    {
        InitializeComponent();

        CreateDevice();
        BuildWindows();
    }

    void BuildWindows()
    {
        var listBox = new System.Windows.Controls.ListBox();
        listBox.ItemsSource = Enumerable.Range(0, 100);
        var elementHost = new ElementHost();
        elementHost.Child = listBox;

        elementHost.Dock = DockStyle.Fill;
        Controls.Add(elementHost);
        slimPanel.Dock = DockStyle.Left;
        Controls.Add(slimPanel);
    }

    void CreateDevice()
    {
        PresentParameters presentParams = new PresentParameters();
        presentParams.BackBufferHeight = slimPanel.ClientRectangle.Height;
        presentParams.BackBufferWidth = slimPanel.ClientRectangle.Width;
        presentParams.DeviceWindowHandle = slimPanel.Handle;

        var device = new Device(Direct3D, 0, DeviceType.Hardware, slimPanel.Handle, CreateFlags.HardwareVertexProcessing, presentParams);
    }
}
滚动条不会显示。我能够让滚动条显示我是否确保列表框在设备创建之前开始绘制

最终的解决方案是在构造函数中将WPF列表框添加到我的表单中,然后在表单完成加载后将其删除。我不确定这是否是WPF或DirectX中的错误,我可能会尝试向Microsoft提交错误


顺便说一句,我不能让XNA引起这个问题。

我采纳了所有人的建议,将我的应用程序移植到SlimDX。这并不太糟糕(几乎每个类/方法/字段在SlimDX中的名称都与MDX完全相同)。不幸的
public partial class MainForm : Form
{
    Direct3D Direct3D = new Direct3D();
    Panel slimPanel = new Panel();

    public MainForm()
    {
        InitializeComponent();

        CreateDevice();
        BuildWindows();
    }

    void BuildWindows()
    {
        var listBox = new System.Windows.Controls.ListBox();
        listBox.ItemsSource = Enumerable.Range(0, 100);
        var elementHost = new ElementHost();
        elementHost.Child = listBox;

        elementHost.Dock = DockStyle.Fill;
        Controls.Add(elementHost);
        slimPanel.Dock = DockStyle.Left;
        Controls.Add(slimPanel);
    }

    void CreateDevice()
    {
        PresentParameters presentParams = new PresentParameters();
        presentParams.BackBufferHeight = slimPanel.ClientRectangle.Height;
        presentParams.BackBufferWidth = slimPanel.ClientRectangle.Width;
        presentParams.DeviceWindowHandle = slimPanel.Handle;

        var device = new Device(Direct3D, 0, DeviceType.Hardware, slimPanel.Handle, CreateFlags.HardwareVertexProcessing, presentParams);
    }
}
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
(HWND)this->Handle.ToPointer(),
D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE,
&d3dpp,
p);