Я ищу некоторое представление о работе 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: Первоначальная причина была найдена, см. Ниже.(Добавленный тег темы)