如何强制嵌入扩展器的WPF TreeView重新排列大小?

时间:2019-04-03 17:19:36

标签: wpf treeview expander

我在Grid.Column中有3个扩展器,应该共享可用空间(高度)。一些扩展器应获取所需的所有空间,另一些扩展器应在打开时“共享”空间。因此,我创建了一个带有AttachedProperty“ ChildShareHeight”的非常简单的StackablePanel。到目前为止一切顺利,我的小组正在为每个扩展器分配适当的空间。不幸的是,Expander.Content没有按预期反应。当ExpanderContent块小于TreeView时,不会出现TreeView控件中的内部ScrollViewer,并且我没有找到一种方法来将TreeView的大小限制为Expander.Content元素的大小(以激活ScrollViewer)或如何强制对Expander.Content元素进行布局更新。

这2张照片说明了我的问题: [1]足够的空间-不共享(https://ibb.co/FBGFxNW) [2]空间不足-主动共享(https://ibb.co/K2s4nB9)。 为了验证布局过程,我在Expander.Content元素中放置了一个“透明”面板来跟踪Measure和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 :(得分:0)

我正在将MaterialDesign for WPF库与自己的Style for Expander控件一起使用。我在样式中找到了一个围绕ContentPresenter的StackPanel。这就是问题所在,为什么TreeView不使用嵌入式ScrollViewer。我没有使用StackPanel创建了自己的样式,问题已解决。