我在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>
答案 0 :(得分:0)
我正在将MaterialDesign for WPF库与自己的Style for Expander控件一起使用。我在样式中找到了一个围绕ContentPresenter的StackPanel。这就是问题所在,为什么TreeView不使用嵌入式ScrollViewer。我没有使用StackPanel创建了自己的样式,问题已解决。