Как заставить WPF TreeView, встроенный в Expander, переупорядочить размер? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть 3 расширителя в Grid.Column, которые должны разделять доступное пространство (высоту).Некоторый расширитель должен получить все необходимое пространство, другой должен «разделить» пространство при открытии.Поэтому я создал очень простую StackablePanel с AttachedProperty "ChildShareHeight".Пока все хорошо, и моя Панель назначает подходящее место для каждого расширителя.К сожалению, Expander.Content не реагирует должным образом.Когда блок ExpanderContent меньше, чем TreeView, внутренний ScrollViewer из элемента управления TreeView не отображается, и я не могу найти способ ограничить размер TreeView размером элемента Expander.Content (для активации ScrollViewer) или какдля принудительного обновления макета для элемента Expander.Content.

Эти 2 изображения иллюстрируют мою проблему: [1] Достаточно места - нет общего доступа (https://ibb.co/FBGFxNW) [2] Недостаточно места - активный общий доступ (https://ibb.co/K2s4nB9). Чтобы проверить процесс размещения, я обнаружил «прозрачную» панель в элементе Expander.Content для отслеживания функций Measure и Arrange. Каждый Expander запускается правильно для Measure and Arrange, но Expander.Content необновлено.

Я также искал некоторые другие решения, такие как привязка свойства TreeView MaxHeight к некоторым внешним элементам, но я пока не нашел никакого рабочего решения. Помещение всей группы Expander в ScrollViewer не являетсявариант для меня. Есть идеи, как ее решить?

Ниже XAML моего примера.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <uic:StackablePanel Grid.Column="1" Margin="10">
        <Expander Header="Expander 1" IsExpanded="False" Margin="5" BorderBrush="Blue" uic:StackablePanel.ChildShareHeight="False">
            <Expander.Content>
                <uic:HeightLimitPanel >
                    <StackPanel Orientation="Vertical" uic:HeightLimitPanel.ExpanderName="Expander 1">
                        <TextBlock Text="Test 10"/>
                       ...
                    </StackPanel>
                </uic:HeightLimitPanel>
            </Expander.Content>
        </Expander>
        <Expander Header="Expander 2" IsExpanded="False" Margin="5" BorderBrush="Red" uic:StackablePanel.ChildShareHeight="True">
            <Expander.Content>
                <uic:HeightLimitPanel >
                    <TreeView uic:HeightLimitPanel.ExpanderName="Expander 2">
                        <TreeViewItem Header="Test 2" IsExpanded="True">
                            <TreeViewItem Header="Text 2.10"/>
                            ...
                            <TreeViewItem Header="Text 2.18"/>
                        </TreeViewItem>
                    </TreeView>
                </uic:HeightLimitPanel>
            </Expander.Content>
        </Expander>
        <Expander Header="Expander 3" IsExpanded="False" Margin="5" BorderBrush="Green" HorizontalAlignment="Stretch" uic:StackablePanel.ChildShareHeight="True" >
            <Expander.Content>
                <uic:HeightLimitPanel>
                    <TreeView uic:HeightLimitPanel.ExpanderName="Expander 3">
                        <TreeViewItem Header="Test 3" IsExpanded="True">
                            <TreeViewItem Header="Text 3.10"/>
                             ...

                            <TreeViewItem Header="Text 3.21"/>
                        </TreeViewItem>
                    </TreeView>
                </uic:HeightLimitPanel>
            </Expander.Content>
        </Expander>
    </uic:StackablePanel>
</Grid>

1 Ответ

0 голосов
/ 09 апреля 2019

Я использовал MaterialDesign для библиотеки WPF с собственным элементом управления Style for Expander. Я нашел в стиле StackPanel, окружающий ContentPresenter. Это была проблема, почему TreeView не использовал встроенный ScrollViewer. Я создал собственный стиль без StackPanel, и проблема исправлена.

...