无法让WPF Listview在列表中的可展开项折叠时也折叠。

3
我有一个包含两个Expander的wpf ListView。当这些可扩展控件展开时,列表视图会为内容腾出空间。但是当它们收缩时,列表视图不会“收回”额外的空间。我已经在所有地方将HorizontalAlignmentVerticalAlignment设置为Stretch。有没有办法解决这个问题?DetailsChart列包含了这些可扩展控件。请参考下面的代码。谢谢。
<Window.Resources>
    
    <DataTemplate x:Key="StockPriceChangeCell">
        <StackPanel Orientation="Horizontal">
            <Label Name="stockPriceChangeValue" Foreground="{Binding StockPriceChangeColor}" Content="{Binding StockPriceChange}" Width="Auto"></Label>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="DetailsCell">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Expander Header="Details..." BorderBrush="DarkBlue" Width="200" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Grid Name="stockDetailGrid" Background="Beige" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ShowGridLines="False">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                        <RowDefinition Height="6*" />
                        <RowDefinition Height="96*" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Label Grid.Row="0" Grid.Column="0" Name="previousClosePrompt" FontWeight="Bold" FontSize="12" Height="28" Width="Auto">Prev Close:</Label>
                    <Label Grid.Row="0" Grid.Column="1" Name="previousCloseValue" FontWeight="Bold" FontSize="12" Height="28" Width="Auto" Content="{Binding StockDetails.PreviousClose}"></Label>
                    <Separator Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator3" Margin="0,2" />
                    <Label Grid.Row="2" Grid.Column="0" Name="openPricePrompt" FontWeight="Bold" FontSize="12" Height="28">Open:</Label>
                    <Label Grid.Row="2" Grid.Column="1" Name="openPriceValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.OpeningPrice}"></Label>
                    <Separator Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator5" Margin="0,2" />
                    <Label Grid.Row="4" Grid.Column="0" Name="yearlyTargetEstimatePrompt" FontWeight="Bold" FontSize="12" Height="28">1y Target Est:</Label>
                    <Label Grid.Row="4" Grid.Column="1" Name="yearlyTargetEstimateValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.YearTargetEstimate}"></Label>
                    <Separator Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator6" Margin="0,2" />
                    <Label Grid.Row="6" Grid.Column="0" Name="stockDaysRangePrompt" FontWeight="Bold" FontSize="12" Height="28">Day's Range:</Label>
                    <Label Grid.Row="6" Grid.Column="1" Name="stockDaysRangeValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.DaysRange}"></Label>
                    <Separator Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator7" Margin="0,2" />
                    <Label Grid.Row="8" Grid.Column="0" Name="stockYearsRangePrompt" FontWeight="Bold" FontSize="12" Height="28">52wk Range:</Label>
                    <Label Grid.Row="8" Grid.Column="1" Name="stockYearsRangeValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.YearsRange}"></Label>
                    <Separator Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator8" Margin="0,2" />

                    <Label Grid.Row="10" Grid.Column="0" Name="averageVolumePrompt" FontWeight="Bold" FontSize="12" Height="28">Avg Vol (3m):</Label>
                    <Label Grid.Row="10" Grid.Column="1" Name="averageVolumeValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.AverageVolume}"></Label>
                    <Separator Grid.Row="11" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator9" Margin="0,2" />
                    <Label Grid.Row="12" Grid.Column="0" Name="marketCapPrompt" FontWeight="Bold" FontSize="12" Height="28">Market Cap:</Label>
                    <Label Grid.Row="12" Grid.Column="1" Name="marketCapValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.MarketCap}"></Label>
                    <Separator Grid.Row="13" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator10" Margin="0,2" />
                    <Label Grid.Row="14" Grid.Column="0" Name="priceEarningRatioPrompt" FontWeight="Bold" FontSize="12" Height="28">P/E (ttm):</Label>
                    <Label Grid.Row="14" Grid.Column="1" Name="priceEarningRatioValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.PriceEarningsRatio}"></Label>
                    <Separator Grid.Row="15" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator11" Margin="0,2" />
                    <Label Grid.Row="16" Grid.Column="0" Name="earningsPerSharePrompt" FontWeight="Bold" FontSize="12" Height="28">EPS (ttm):</Label>
                    <Label Grid.Row="16" Grid.Column="1" Name="earningsPerShareValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.EarningsPerShare}"></Label>
                    <Separator Grid.Row="17" Grid.Column="0" Grid.ColumnSpan="2" Name="stockSeparator12" Margin="0,2" />
                    <Label Grid.Row="18" Grid.Column="0" Name="dividendYieldPrompt" FontWeight="Bold" FontSize="12" Height="28">Div &amp; Yield:</Label>
                    <Label Grid.Row="18" Grid.Column="1" Name="dividendYieldValue" FontWeight="Bold" FontSize="12" Height="28" Content="{Binding StockDetails.DividendYield}"></Label>
                </Grid>
            </Expander>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="ChartCell">
        <StackPanel>
            <Expander Header="Chart..." BorderBrush="DarkBlue" Width="200" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Image Name="stockGraph" Stretch="None" Source="{Binding StockChart}"/>
            </Expander>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

这是一个列表视图:
<TabItem Name="myStocksTab" Header="My Stocks" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <StackPanel Name="myStocksTabContainerPanel" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Label Name="myStocksPrompt" Foreground="GhostWhite" Background="DarkBlue" FontSize="16" FontWeight="Bold">My Stocks</Label>
        <ListView Name="stocksUIList" ItemsSource="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Action" CellTemplate="{StaticResource ButtonsCell}" Width="Auto"/>
                    <GridViewColumn Header="Company/Stock Symbol" Width="Auto" DisplayMemberBinding="{Binding CompanyName}"/>
                    <GridViewColumn Header="Last Trade" Width="Auto" DisplayMemberBinding="{Binding LastTrade}"/>
                    <GridViewColumn Header="Trade Time" Width="Auto" DisplayMemberBinding="{Binding StockDetails.TradeTime}"/>
                    <GridViewColumn Header="Change" CellTemplate="{StaticResource StockPriceChangeCell}"/>
                    <GridViewColumn Header="Volume" Width="Auto" DisplayMemberBinding="{Binding TradingVolume}"/>
                    <GridViewColumn Header="Details" CellTemplate="{StaticResource DetailsCell}" Width="215"/>
                    <GridViewColumn Header="Chart" CellTemplate="{StaticResource ChartCell}" Width="215"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Name="addStock" FontSize="14" FontWeight="Bold" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Click="AddCompanyStock">Add Stock...</Button>
    </StackPanel>
2个回答

1

我知道这是一个较旧的帖子,但我正在寻找解决此问题的方法,并希望用我的解决方案更新它。

经过一些搜索,我能够通过使用在此处找到的解决方案来修复它:ListView with nested Expander not collapsing

基本上,我正在使用一个具有Item Template中Expanders的ListView。当折叠Expander时,其大小不会正确调整。而且,当Expander内容大于ListView时,滚动条无法正常工作。

解决方法很简单,只需将ListView替换为ItemsControl,并将ItemsControl放置在ScrollViewer内部即可。


0

听起来ListView可能存在某种布局错误。您是否尝试在任一可扩展项的Collapsed事件中调用ListView上的InvalidateVisual()方法?这可能会解决问题。


同样的问题,但是InvalidateVisual()似乎没有效果。 - Squirrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接