Сетка с именем RowDefinition не может быть заполнена как ItemsPanel в WPF4 - PullRequest
6 голосов
/ 23 сентября 2011

У меня есть Grid, определенный в ItemsControl ItemsPanelTemplate, и для одного из RowDefinitions определено x: Name (поэтому я могу анимировать размер строки).

<ItemsControl ItemsSource="{Binding Data, Source={StaticResource model}}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition x:Name="t" />
                    <RowDefinition />
                </Grid.RowDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Это хорошо работало в 3.5, однако, когда мы недавно обновили до 4.0, все это развалилось. То, что я увидел бы, - это таблица с определением строк и столбцов, но без дочерних элементов.

Если я установлю IsItemsHost = true в Grid, все начнет работать. Если я добавляю x: Name к самой Grid или удаляю x: Name из RowDefinition, все это работает.

<ItemsPanelTemplate>
    <Grid IsItemsHost="True">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

или

<ItemsPanelTemplate>
    <Grid x:Name="g">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

Это похоже на ошибку, но я хотел проверить у сообщества и посмотреть, согласны ли люди, или я что-то упустил. Я не смог найти ничего в Connect или в Интернете, поэтому кто-нибудь может объяснить, что я вижу?

1 Ответ

0 голосов
/ 29 ноября 2011

Я не верю, что это ошибка. То, что вы сделали здесь, это непреднамеренная ошибка в вашем коде, которая не выдает исключение во время разработки или компиляции, но во время выполнения, поэтому ваша анимация не завершена, и содержимое сетки не было обработано.

Конфликт находится в WPF XAML Namescope , специфичном для DataTemplate, как описано в этой статье MSDN . В статье утверждается, что именованным элементам в шаблоне автоматически присваивается уникальный Namescope для предотвращения конфликта имен, но в нем не сообщается, что происходит, когда корень шаблона не имеет имени, но содержит именованные дочерние элементы или как IsItemsHost влияет на ItemsTemplate.

  1. Один из подходов, которые я могу предложить, - использовать исходный сценарий и во время отладки следить за выходным журналом на предмет любых исключений времени выполнения, которые были незаметно обработаны синтаксическим анализатором XAML, связанным с вашей анимацией. 1016 *

  2. Другой (лично я думаю, лучше) подход заключается в создании нового «шаблонного элемента управления», который наследуется от ItemsControl. Здесь вы можете получить доступ к ItemsPanel во время перегрузки ApplyTemplate, чтобы найти ваш Grid / GridColumn и выполнить там анимацию. Вот хороший учебник .

...