2013-06-24 52 views
0

我见过不少人提出这个问题,我觉得我的问题略有不同。我有一个列表框,它包含一系列相同的自定义用户控件。这些控件在运行时添加到列表框中。现在,我目前有我的列表框项目首次创建并插入控件时正确调整自己的大小。列表框内容在列表框大小发生变化时不会动态调整大小

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

我试着附加到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> 

再次好像我的用户是正确的能够扩展本身它只是不在父容器调整大小时获取命令。

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

EDIT2:我知道是什么原因引起的问题,但我不知道如何解决它。发生了什么事情是我的用户控件中的滑块不会与控件的其余部分一起调整大小,除非在调整大小期间更改滑块的值。即时我改变它的价值甚至一小部分它自动调整自己。我如何强制它调整大小?

+0

删除后面的代码。 WPF不需要这个。发布UserControl的完整XAML。使用Snoop在运行时检查可视化树,看看发生了什么。 WPF独立于分辨率,它不需要代码隐藏黑客。 –

回答

0

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

相关问题