2013-06-24 84 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

我確定滑塊導致了問題,我嘗試了很多方法來強制滑塊在需要時重新繪製,但我沒有成功。我的最終解決方案是完全移除滑塊。現在工作正常。

相關問題