XAML itemscontrol: видимость contentpresenter не отражает каждый принадлежащий элемент - PullRequest
0 голосов
/ 26 октября 2018

В ItemsControl элементы находятся в ContentPresenter, поэтому, если элемент имеет Visibility = 'свернутый', его ContentPresenter все еще имеет Visibility = 'Visible' ... ( Здесь объясняется такое поведение)

Таким образом, эти 2 примера не показывают одинаковый результат:

Это работает, как я ожидаю:

<UniformGrid Columns="1">
    <Button Content="0"/>
    <Button Content="1"/>
    <Button Content="2" Visibility="Collapsed"/>
    <Button Content="3"/>
</UniformGrid>

Это не работает, как я ожидаю (UniformGrid резервирует место длятретья кнопка также, если она свернута):

<ItemsControl>
    <ItemsControl.ItemsSource>
        <x:Array Type="{x:Type System:Int32}">
            <System:Int32>0</System:Int32>
            <System:Int32>1</System:Int32>
            <System:Int32>2</System:Int32>
            <System:Int32>3</System:Int32>
        </x:Array>
    </ItemsControl.ItemsSource>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Visibility="{Binding ., Converter={StaticResource CalculatorConverter}, ConverterParameter=IIF(\{0\}\=2\,\'Collapsed\'\,\'Visible\')}" Content="{Binding .}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Кто-нибудь получил эту проблему?Есть ли обходной путь?

1 Ответ

0 голосов
/ 28 октября 2018

Это ожидаемое поведение, потому что кнопка не является прямым потомком UniformGrid. Вместо этого ItemsControl добавляет ContentPresenter, шаблонизированный с DataTemplate, который вы определили к UniformGrid. Итак, в основном визуальное дерево напоминает это: 1

<UniformGrid>
    ....
    <ContentPresenter>
        <Button Visibility="Collapsed" />
    </ContentPresenter>
    ....
</UniformGrid>

Я думаю, это ясно демонстрирует, почему пространство в сетке зарезервировано, даже если кнопка свернута. Конечно, чтобы исправить это, вы должны вместо этого свернуть ContentPresenter. Это может быть достигнуто с помощью свойства ItemsControl.ItemContainerStyle:

<ItemsControl>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="{x:Type ContentPresenter}">
            <Setter Property="Visiblity" Value="{Binding ., Converter=...}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    ...
</ItemsControl>

1 Приведенный код является только иллюстрацией визуального дерева и не является допустимым WPF XAML.

...