Рендеринг шаблонов преформс - PullRequest
0 голосов
/ 08 января 2012

Я создал свойство типа сетки.Я использовал элемент управления Item, который использует объект viewmodel.Объект VM имеет свойство для отображения и соответствующие им шаблоны данных.Все хорошо.Моя сетка свойств фактически действует как сетка свойств VS

Моя проблема заключается в том, что каждый раз, когда использование изменяет выбранный объект (что приводит к изменениям в сетке свойств), оно занимает много времени (зависит от количествасвойства выбранного объекта).Я понял, что причиной плохой работы является загрузка и рендеринг шаблонов.поэтому я подумал, что могу решить эту проблему, создавая реальные элементы управления для каждого объекта, а не просто используя шаблоны.(Создайте кнопки и текстовое поле для каждого свойства) Надеюсь, это решит время загрузки.

1 - есть ли способ создания реальных элементов управления (в коде) с использованием шаблонов данных?2- есть ли какой-либо другой способ улучшить характеристики моей сетки свойств?

Основной код для propGrid прилагается к этому сообщению

Спасибо, Леон

КОД:

<DataTemplate x:Key="gridItemsControl" >    
        <Grid  Visibility="{Binding Visibility}">
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="60"   MaxWidth="350" Width="{Binding Source={StaticResource firstCulWidth},Path=Width,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource widthToGridLenConverter}}"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Border Grid.Column="0" BorderBrush="#ff333333" BorderThickness="0.5" Grid.ColumnSpan="2"
                            Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter},ConverterParameter=Category}">
                <StackPanel Orientation="Horizontal" Background="#FFA9BFD4" Height="25">
                    <Expander Template="{StaticResource SimpleExpanderTemp}"  ExpandDirection="Left"  IsExpanded="{Binding IsExpanded, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="3,0,5,0"/>
                    <Label Content="{Binding Path=CategoryName,Converter={StaticResource propertyNameToDiplayNameConverter}}" FontSize="12" Foreground="White"  VerticalAlignment="Top" />
                </StackPanel>
            </Border>
            <Border Grid.Column="0" BorderBrush="#ff333333" BorderThickness="0.5" 
                                Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}">
                <Label Margin="5,0,0,0"  Content="{Binding Path=DisplayName,Converter={StaticResource propertyNameToDiplayNameConverter}}"/>
            </Border>
            <GridSplitter  Grid.Row="0"  Grid.Column="0"  Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}" HorizontalAlignment="Right" Width="4" Background="Transparent"/>
            <Border  Grid.Column="1" BorderBrush="#ff333333" BorderThickness="0.5" 
                                Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}">
                <ContentPresenter Grid.Column="1" Margin="10,1,10,1" HorizontalAlignment="Left" 
                                        ContentTemplate="{Binding  Path=InlineTemplate}" />
            </Border>
        </Grid>
    </DataTemplate>

Обновление: вот контейнер

 <ItemsControl Name="propsDataGrid"   ItemsSource="{Binding Properties}" ItemTemplate ="{StaticResource gridItemsControl}">
                        <ItemsControl.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Close all expanders" Click="MenuItem_Click" Visibility="{Binding IsAlphaBeticSort,Converter={StaticResource boolToVisConverter},ConverterParameter=VisForFalse}"></MenuItem>
                                <MenuItem Header="Expand all" Name="mnExpandeAll"  Click="mnExpandeAll_Click"  Visibility="{Binding IsAlphaBeticSort,Converter={StaticResource boolToVisConverter},ConverterParameter=VisForFalse}"></MenuItem>
                            </ContextMenu>
                        </ItemsControl.ContextMenu>
                            <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <!--<ItemsControl.ItemTemplate>
                        <DataTemplate >
                                <Grid  Visibility="{Binding Visibility}">
                                <Grid.RowDefinitions>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition MinWidth="60"   MaxWidth="350" Width="{Binding Source={StaticResource firstCulWidth},Path=Width,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource widthToGridLenConverter}}"/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <Border Grid.Column="0" BorderBrush="#ff333333" BorderThickness="0.5" Grid.ColumnSpan="2"
                                        Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter},ConverterParameter=Category}">
                                        <StackPanel Orientation="Horizontal" Background="#FFA9BFD4" Height="25">
                                            <Expander Template="{StaticResource SimpleExpanderTemp}"  ExpandDirection="Left"  IsExpanded="{Binding IsExpanded, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="3,0,5,0"/>
                                            <Label Content="{Binding Path=CategoryName,Converter={StaticResource propertyNameToDiplayNameConverter}}" FontSize="12" Foreground="White"  VerticalAlignment="Top" />
                                    </StackPanel>
                                </Border>
                                <Border Grid.Column="0" BorderBrush="#ff333333" BorderThickness="0.5" 
                                          Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}">
                                    <Label Margin="5,0,0,0"  Content="{Binding Path=DisplayName,Converter={StaticResource propertyNameToDiplayNameConverter}}"/>
                                </Border>
                                <GridSplitter  Grid.Row="0"  Grid.Column="0"  Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}" HorizontalAlignment="Right" Width="4" Background="Transparent"/>
                                <Border  Grid.Column="1" BorderBrush="#ff333333" BorderThickness="0.5" 
                                          Visibility ="{Binding IsCategoryItem,Converter={StaticResource isCategoryItemToVisibilityConverter}}">
                                    <ContentPresenter Grid.Column="1" Margin="10,1,10,1" HorizontalAlignment="Left" 
                                                  ContentTemplate="{Binding  Path=InlineTemplate}" />
                                </Border>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>-->
                </ItemsControl>

1 Ответ

0 голосов
/ 08 января 2012

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

(Кстати, способ создания сетки, настройки ее ширины, выглядит так, как будтобыть избыточным, вы, вероятно, можете просто поделиться размером .)

Чтобы ItemsControl виртуализировать элементы, вам необходимо:

  1. Установитьот ItemsPanel до VirtualizingStackPanel
  2. Иметь шаблон управления, который содержит ScrollViewer вокруг ItemsPresenter, где будет VirtualizingStackPanel.
  3. Установите ScrollViewer.CanContentScroll на true, чтобы включить прокрутку по элементу, который допускает виртуализацию.

например

<ItemsControl ItemsSource="{Binding Items}"
              ScrollViewer.CanContentScroll="True">
    <ItemsControl.Template>
        <ControlTemplate>
            <Border Name="Bd" Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true"
                    Padding="1">
                <ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- ... -->
</ItemsControl>

Если это все еще слишком медленно, вы можете сделать целое ItemsControl часть шаблона, которая применяется для каждого типа в качестве презумумаСодержание этой сетки зависит от типа элемента, поэтому другую сетку следует создавать только в случае изменения типа элемента, а также вы можете кэшировать полученные шаблоны (хотя я никогда не пытался это делать).

...