代码之家  ›  专栏  ›  技术社区  ›  Jake Pearson

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

  •  0
  • Jake Pearson  · 技术社区  · 17 年前

    拇指 (下图)。我将其缩小到我的应用程序中使用Managed DirectX(MDX)的插件。如果我删除插件,滚动条就可以了。我知道MDX已被弃用,但我认为今天不是考虑升级的日子。有人见过他们 ,或者知道我该怎么办?

    alt text

    <UserControl x:Class="MAAD.Plugins.Experiment.Visual.TestEditor"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="403" Width="377">
    <ListBox Margin="12" Name="listBox1" />
    </UserControl>
    

    8 回复  |  直到 7 年前
        1
  •  2
  •   Promit    16 年前

        2
  •  2
  •   mpg    16 年前

    我也见过这个bug。这本身不是SlimDX问题,而是由于DirectX在x87 FP堆栈上使用32位数学。

    初始化设备时使用FpuPreserve标志,问题应该会消失。

        3
  •  1
  •   Peter Tate    17 年前

    我的建议是去掉MDX插件。

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

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

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

    我希望我能更有帮助。祝你好运。

        4
  •  1
  •   user404068    15 年前

    我也有这个问题。正如mpg所发现的,在设备创建中添加D3DCREATE_FPU_PRESERVE标志将修复此问题。如果有人想知道代码是什么样子的:

    d3d->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    (HWND)this->Handle.ToPointer(),
    D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE,
    &d3dpp,
    p);
    
        5
  •  0
  •   Tobias Langner    17 年前

    SlimDX 是围绕DX的较新包装,目前正在积极开发中。也许您可以在SlimDX中执行与使用MDX插件相同的操作,滚动条功能再次正常。

        6
  •  0
  •   Promit    17 年前

    你在Vista上吗?我们已经看到,在Vista目标下运行时,通过创建Direct3D9Ex设备而不是普通设备,很多SlimDX/WPF都会消失。

        7
  •  0
  •   Jake Pearson    17 年前

    我采纳了大家的建议,将我的应用移植到了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列表框添加到我的表单中,然后在表单加载完成后将其删除。

        8
  •  0
  •   Steffen Opel Norm Johanson    17 年前

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