MDX / SlimDX портит полосы прокрутки WPF? - PullRequest
0 голосов
/ 29 июня 2009

У меня очень простой пользовательский элемент управления WPF, смешанный с приложением Windows Forms. У этого есть список, который отображает свою полосу прокрутки без большого пальца (изображение ниже). Я сузил его до плагина в моем приложении, который использует 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 ]

2 голосов
/ 17 декабря 2009

Я тоже видел эту ошибку. Это не проблема SlimDX как таковая, а скорее из-за использования DirectX 32-битной математики в стеке x87 FP.

Используйте флаг FpuPreserve при инициализации устройства, и проблема должна исчезнуть.

2 голосов
/ 17 декабря 2009

Как оказалось, сегодня я наткнулся на решение, работая с клиентом. Если вы добавите флаг CreateFlags.FpuPreserve к созданию вашего устройства, полоса прокрутки должна вернуться к нормальной работе.

1 голос
/ 24 марта 2011

У меня тоже была эта проблема. Как обнаружил mpg, добавление флага D3DCREATE_FPU_PRESERVE к созданию устройства исправит это. если кому-то интересно, как выглядит код:

d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
(HWND)this->Handle.ToPointer(),
D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE,
&d3dpp,
p);
1 голос
/ 10 июля 2009

Я предлагаю избавиться от вашего плагина MDX.

Я использовал и WPF, и MDX, хотя не в одном проекте. Обе библиотеки взаимодействуют с DirectX и в конечном итоге будут хранить состояние на собственном уровне, что может вызвать проблемы. С WPF у меня были проблемы с рендерингом, связанные с моими видеодрайверами, и исправление состояло в том, чтобы обновить видеодрайвер до более новой версии.

Инициализация DirectX может повлиять на работу DirectX (и вашего ЦП!) Для всего вашего приложения. Например, когда вы инициализируете MDX по умолчанию, он заставит ЦП выполнять все вычисления с плавающей запятой с одинарной точностью для всего процесса, независимо от того, как вы объявляете исходное значение. Как вы можете себе представить, это привело к тому, что в течение долгого времени у нас возникало много царапин по поводу того, почему мы получали разные результаты в приложении и наших модульных тестах.

Я подозреваю, что при инициализации MDX он включает или отключает некоторые функции или настройки в вашей видеокарте (или, возможно, некоторые настройки программного обеспечения), которые как-то влияют на конвейер WPF.

Хотел бы я быть более полезным. Удачи.

0 голосов
/ 23 июля 2009

Вы на Vista? Мы видели, как многие SlimDX / WPF просто исчезают, создавая устройство Direct3D9Ex вместо обычного при работе под целями Vista.

0 голосов
/ 23 июля 2009

Я принял все советы и портировал свое приложение на 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 голосов
/ 14 июля 2009

Я бы высказал оговорки предыдущих постеров относительно MDX в контексте WPF. Один выстрел в темноту:

Вы уже пытались настроить таргетинг на свой элемент управления для .NET Framework 3.5 SP1? Была проведена значительная работа по взаимодействию и производительности DirectX / Direct3D, см., Например:

Некоторые из этих улучшений могут в конечном итоге дать положительные побочные эффекты в отношении вашей проблемы.

0 голосов
/ 14 июля 2009

Вы пробовали SlimDX вместо MDX? SlimDX - это новая оболочка для DX, которая активно разрабатывается. Возможно, вы могли бы сделать в SlimDX то же, что и для своего MDX-плагина, и полоса прокрутки снова работает нормально.

Питер прав насчет взаимодействия WPF и MDX. WPF использует DirectX для внутренних целей. Таким образом, изменение настроек в MDX (или SlimDX) может изменить поведение WPF. Вы также можете попробовать взглянуть на код полосы прокрутки WPF (например, с помощью .NET Reflector, IDA, что вам нужно) и проверить настройки, на которые опирается панель прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...