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