2009-06-29 78 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);