Silverlight: отключить виртуализацию пользовательского интерфейса? - PullRequest
2 голосов
/ 07 октября 2011

Есть ли простой способ отключить виртуализацию пользовательского интерфейса в элементе управления ListBox?Я пытаюсь найти элемент управления в элементе управления ListBox с помощью метода «FindName ()», но в случае, если элемент управления явно находится вне окна веб-браузера, он не находит элемент управления.Я почти уверен, что виновником является виртуализация пользовательского интерфейса.Поскольку элемент управления прокручивается со страницы, он больше не извлекается успешно с помощью «FindName ()».

Когда я прокручиваю его обратно на экран, он успешно возвращает элемент управления.

Это расширение этого вопроса:

Silverlight: FrameworkElement.FindName () не находит элемент управления, когда он не «виден» в окне браузера

Обновление с примером кодирования

Это код, на котором я пытаюсь получить элемент управления.«DynamicTagFormFields» - это элемент управления ListBox.

textField tf = DynamicTagFormFields.FindName(s.KeyValue) as textField;

Возвращает действительный объект «textField», если фактический элемент управления textField, который я пытаюсь получить, отображается на экране для конечного пользователя.Однако, если я прокручиваю элемент управления textField вне поля зрения, используя вертикальную полосу прокрутки ListBox, а затем снова запускаю процесс, вышеупомянутый код вернет ноль.

Это XAML ListBox:

 <ListBox x:Name="DynamicTagFormFields" Margin="0" Style="{StaticResource ListBoxStyle1}" ItemContainerStyle="{StaticResource ListBoxItemStyle4}" d:LayoutOverrides="Height" Grid.Row="2" IsTabStop="False" TabNavigation="Local" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

Объект textField динамически добавляется в ListBox программным способом со следующим кодом:

DynamicTagFormFields.Items.Add(textFieldControl);

Ответы [ 2 ]

8 голосов
/ 07 октября 2011

Вы пробовали это: -

<ListBox x:Name="DynamicTagFormFields" Margin="0" Style="{StaticResource ListBoxStyle1}"
    ItemContainerStyle="{StaticResource ListBoxItemStyle4}" d:LayoutOverrides="Height"
    Grid.Row="2" IsTabStop="False" TabNavigation="Local"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemsPanel>
       <ItemsPanelTemplate>
           <StackPanel />
       </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Панель по умолчанию - VirtualisingStackPanel, которая может быть причиной вашей проблемы.

0 голосов
/ 25 июня 2015

в http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/13/performance-characteristics-of-the-silverlight-datagrid.aspx в нем говорится следующее информативное описание виртуализации DataGrid, в котором показаны два способа его отключения, первый из которых заключается в добавлении ScrollViewer вокруг DataGrid, который на самом деле не предлагается в качестве метода отключения виртуализации строк, поскольку DataGrid имеет строка заголовка, поэтому они также показывают, как изменить свой шаблон XAML. Для ListBox, хотя у него нет такого заголовка, может оказаться целесообразным обернуть его в ScrollViewer, придав ему бесконечный размер и, таким образом, отключив виртуализацию строк

... бросьте ScrollViewer вокруг вашей DataGrid. Это дает DataGrid бесконечный размер и эффективно отключает виртуализацию. к несчастью на моем проекте я сделал это случайно, не осознавая эффекта по производительности. Вам действительно нужно использовать прокрутку DataGrid бары, а не ScrollViewer. Обратите внимание, что если вы хотите отключить интерфейс Виртуализация (например, для небольших сетей) вы можете изменить шаблон DataGrid и поместите RowsPresenter в ScrollViewer, который снова вызовет это думать, что он имеет бесконечный размер. Это полезно, потому что вы не будете продолжайте получать события LoadingRow и UnloadingRow во время прокрутки. Будьте внимательны, чтобы правильно сделать заголовки столбцов. (см. XAML в приложении в конце этой статьи).

...