当列表框大小更改时,列表框内容不会动态调整大小

时间:2013-06-24 21:05:13

标签: silverlight listbox stretch

我见过很多人问这个问题,我觉得我的问题略有不同。我有一个列表框,其中包含一系列相同的自定义用户控件。这些控件在运行时添加到列表框中。现在,我首先让我的列表框项目在首次创建并插入控件时正确调整大小。

这是奇怪的部分。如果我调整列表框的大小,之前可见的控件不会调整为新的列表框宽度。换句话说,如果我添加12个控件并且该框仅显示4个(其余部分由滚动条隐藏),那么如果我调整框大小,前4个控件仍将是原始宽度,如果我滚动则其他8个将是正确的尺寸。此外,如果我以任何方式操纵列表项,他们会自动调整自己适当的宽度。 SEE EDIT2

我已尝试附加到sizeChanged事件并在列表框和项目上发出以下内容,但它没有任何效果。我想我需要找到一些方法来重置列表框项目的布局信息,但我无法找到该命令。

item.InvalidateArrange();
item.InvalidateMeasure();
Layers.UpdateLayout();
item.UpdateLayout();

我认为这与我添加的项目有关,因为即使我从lisbox中分离项目然后附加它们,它们仍然是错误的宽度。

这是我的列表框代码:

<ListBox x:Name="Layers" VerticalContentAlignment="Top" Margin="0,17,0,0" BorderThickness="0,1,0,0" HorizontalContentAlignment="Stretch" SizeChanged="Layers_SizeChanged">
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                            </Style>
                        </ListBox.ItemContainerStyle>
                    </ListBox>

以下是我的项目代码

<UserControl x:Class="ListOverlayItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:Data"
HorizontalContentAlignment="Stretch">

<UserControl.Resources>
    <data:Translator x:Key="translatorString" />
</UserControl.Resources>

<Border BorderBrush="Silver" BorderThickness="0,0,0,0" Name="border1" HorizontalAlignment="Stretch">
    <Grid x:Name="layout" HorizontalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition Height="19"/>
            <RowDefinition Height="25" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="60" />
        </Grid.ColumnDefinitions>
        <!-- Column 0 -->
        <ScrollBar Name="arrangeIcon" FlowDirection="LeftToRight" Maximum="10" SmallChange="1" Value="5" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2"/>

        <!-- Column 1 -->
        <Slider  Name="OverlayOpacity" Height="25" Grid.Column="1" Margin="6,0,0,0" Grid.Row="1"  Maximum="1" LargeChange="0.1" ValueChanged="OverlayOpacity_ValueChanged"/>
        <TextBlock x:Name="OverlayName" Text="{Binding Path=LocationName}" Foreground="#FFF08D2D" Margin="10,2,0,0" Grid.Column="1" FontSize="12" Height="18" VerticalAlignment="Top" />

        <!-- Column 3 -->
        <Button Name="SettingsButton" Grid.Column="3" Content="{Binding TRK_OV_Settings, Source={StaticResource translatorString}}" VerticalAlignment="Center" Click="SettingsButton_Click" />
        <CheckBox x:Name="OverlayEnabled" FlowDirection="LeftToRight" Grid.Column="2" DataContext="{Binding}" HorizontalAlignment="Right" VerticalAlignment="Center" Grid.RowSpan="2" Checked="OverlayEnabled_Checked" Unchecked="OverlayEnabled_Unchecked" />
        <TextBlock Name="percentage" Text="100%" FontSize="9" TextAlignment="Right" Grid.Column="2" Grid.Row="1" VerticalAlignment="Center" Margin="2,6,26,6" MinWidth="30"/>
    </Grid>
</Border>

再次看起来我的UserControl能够正确地扩展自己,只是在调整父容器大小时没有得到命令。

编辑:哎呀,删除了WPF标记,因为它被错误地添加了。我认为我已经把它归结为滑块是罪魁祸首。如果我将滑块设置为固定大小而不是&#39;拉伸&#39;然后项目正确缩放就好了。所以现在的问题是如何强制滑块调整自身大小。

EDIT2:我知道是什么导致了这个问题,但我不知道如何解决它。发生的事情是我的用户控件中的滑块不会随着控件的其余部分调整大小,除非我在调整大小期间更改滑块的值。瞬间我改变它的价值甚至一小部分它自动调整自己。我怎么能强迫它调整大小?

1 个答案:

答案 0 :(得分:0)

我确定滑块导致了问题,我尝试了许多方法来强制滑块在需要时重新绘制,但我没有成功。我的最终解决方案是完全移除滑块。现在工作正常。