2009-07-06 6 views
2

Я ищу некоторое представление о работе Silverlight - в настоящее время я подозреваю, что мне нужно больше узнать о том, как диспетчеризация событий и управление перерисовкой для решения проблемы или компромисса по следующей проблеме:Замедление (полоса прокрутки или пользовательский интерфейс в целом) в Silverlight, когда есть много элементов управления

У меня на экране большое количество элементов (из которых я представляю элементы управления). Численно это , хотя точное число зависит от размера окна браузера.

Каждый элемент в конечном итоге отображает информацию (текстовые блокировки, изображения) и имеет некоторые взаимодействия с мышью (подсказки, события мыши для переключения и перетаскивания). На первый взгляд это может напоминать DataGrid, но, к сожалению, это не так (это бесконечно прокручиваемая непрямоугольная поверхность). Но на данный момент каждый элемент - это просто пользовательский элемент управления, в котором есть только прямоугольник.

<UserControl x:Class="MyElement" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="49" Height="49"> 
    <Grid> 
     <Rectangle x:Name="Border" Stroke="Black" Fill="White" /> 
    </Grid> 
</UserControl> 

 

for (int i = 0; i < elementsRequired; i++) 
{ 
    var item = new MyElement(); 
    // Set Canvas.LeftProperty and Canvas.TopProperty to a unique position 
    ElementsArea.Children.Add(item);      
} 

Создание 300 из этих элементов управления и опуская их на холст (или сетки) медленно - 4 секунды, чтобы закончить. Однако, поскольку эта операция редко выполняется, я не так обеспокоен этим, как следующая проблема.

После того, как элементы управления размещены, центральный процессор является нормальным (0%), но попытка использовать несвязанный ScrollBar (примитив ScrollBar без событий) показывает много отставания - большой палец прокрутки борется за то, чтобы не отставать от мыши. Если я увеличиваю/уменьшаю количество элементов, изменяется полоса прокрутки.


В предположении, что полотно элемент (который обычно позволяет элементам переполнения) делает некоторые расчеты отсечения я пытался как определяющий прямоугольник отсечения для холста, движущемся скроллбар полностью прочь холст (в другой макет дерево) и переход от холста к сетке (все 300 элементов, которые просто сидят в центре, перекрываются). Я также тестирую изменение элементов Visiblity на Collasped без эффекта.

Я также попытался подставить элементы - создание только прямоугольника или изображения уменьшает замедление, но только до степени, которую я ожидал бы от того, что на дереве было меньше элементов (MyElement - это 3 элемента управления, UserControl, Grid и Rectangle вместо 1).

В предположении, что некоторый метод поиска должен был поперек всех 300 моих элементов перед тем, как попасть на полосу прокрутки, я попытался изменить порядок объявления в файле XAML без везения.

И, наконец, я попытался установить IsHitTestVisible и IsEnabled на false для элементов и всего холста, чтобы не повлиять.


Насколько я могу сказать, что я большой, но вполне разумное количество статических элементов управления, которые не используют любой процессор нормально, но когда я пытаюсь взаимодействовать с несвязанной ScrollBar, они создают какой-то пробке в интерфейсе пользовательского интерфейса или рендеринга.

Любые идеи, где это или как его решить?

EDIT: Первоначальная причина была найдена, см. Ниже.(Добавленный тег темы)

ответ

0

Сквозь проб и ошибок я наконец нашел ответственный фактор.

Я использую систему Theming из Silverlight Toolkit. Когда я создаю много элементов управления динамически («окна» и «диалоги»), тема имеет ApplyMode = «Авто», в которой элементы управления автоматически применяют стили темы.

По какой-либо причине перетаскивание большого пальца элемента управления полосой прокрутки запускает это постоянно, в результате чего информация о стиле всех этих элементов управления обновляется независимо от того, где они находятся, или если они даже видны.

К сожалению, я не вижу быстрого решения, которое просто отключается, поскольку динамические элементы управления повсюду. То, что я пытался сделать, это изменить ApplyMode на один раз только для ScrollBar, однако это, похоже, не работает. Мое лучшее предположение заключается в том, что полоса прокрутки динамически создает некоторый контроль для каждого изменения - любое понимание этого?