2009-06-29 64 views
0

我有一个非常简单的WPF用户控件与Windows窗体应用程序混合在一起。它有一个列表框,用于呈现其滚动条,但不包括拇指(图片见下方)。我将其缩小为使用托管DirectX(MDX)的应用程序中的插件。如果我删除插件,滚动条就好了。我知道MDX已被弃用,但我不认为今天是考虑升级的日子。有没有人见过他们的滚动条搞砸了,或者有什么想法我应该做什么?MDX/SlimDX弄乱了WPF滚动条?

而且我应该补充说,这个控件还存在于一个插件中。 2个插件无法相互引用。

alt text http://i41.tinypic.com/3zxcg.png

<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> 

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

回答

2

事实证明,我在与客户合作时偶然发现了这个解决方案。如果将CreateFlags.FpuPreserve标志添加到设备创建中,滚动条应该恢复正常。

1

我的建议是摆脱你的MDX插件。

我已经使用了WPF和MDX,但不在同一个项目中。这两个库都与DirectX交谈,并最终将在本地级别存储状态,这可能会导致问题。使用WPF我已经提出了与我的视频驱动程序相关的问题,修复方法是将视频驱动程序升级到更新的版本。

初始化DirectX可能会影响DirectX(和您的CPU!)为您的整个应用程序执行的方式。例如,默认情况下初始化MDX时,无论您如何声明原始值,它都会将CPU设置为以单精度执行所有浮点计算。正如你可能想象的那样,这导致了很长时间以至于我们在应用程序和单元测试中获得了不同的结果。

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

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

+0

感谢您的写作,但我现在无法退出MDX。我一定会喜欢将来。 – 2009-07-10 20:44:51

0

您是否尝试过使用SlimDX而不是MDX? SlimDX是DX的新包装,并且正在积极开发中。也许你可以在SlimDX中使用MDX-Plugin和滚动条的功能。

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

0

我在WPF的背景下,第二次保留了之前海报中有关MDX的内容。一个镜头陷入黑暗:

您是否已经尝试将您的控件定位到.NET Framework 3.5 SP1?已经有关于的DirectX/Direct3D的互操作性和性能显著的工作,例如参见:在What's New in .NET Framework 3.5 Service Pack 1

一些

0

我接受了所有人的建议,并将我的应用移植到了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 ListBox添加到我的表单中,然后在表单完成加载后将其删除。我不确定这是否是WPF或DirectX中的错误,我可能会尝试向Microsoft提交错误。

顺便说一句,我不能让XNA导致这个​​问题。

0

你在Vista吗?我们已经看到许多SlimDX/WPF通过在Vista目标下运行时创建Direct3D9Ex设备而不是通常的设备而消失。

+0

请原谅noob问题。我如何知道我是否创建了一个Direct3D9Ex与一个正常的Direct3D9Ex? – 2009-07-23 18:01:12

2

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

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

1

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

d3d->CreateDevice(
D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, 
(HWND)this->Handle.ToPointer(), 
D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE, 
&d3dpp, 
p);