0

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

这是奇怪的部分。如果我调整列表框的大小,之前可见的控件不会调整为新的列表框宽度。换句话说,如果我添加 12 个控件并且该框仅显示 4 个(其余的被滚动条隐藏),那么如果我调整框的大小,前 4 个控件仍将是原始宽度,如果我滚动则其他 8 个将是正确的尺寸。此外,如果我以任何方式操作列表项,它们会自动将自身调整到适当的宽度。见 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 标记,因为它被错误地添加了。我想我已经把它归结为滑块是罪魁祸首。如果我将滑块设置为固定大小而不是“拉伸”,那么该项目可以正确缩放。所以现在的问题是我如何强制滑块调整自身大小。

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

4

1 回答 1

0

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

于 2013-07-12T23:59:51.167 回答