この質問をする人がかなりいるのを見てきましたが、私の質問は少し違うように感じます。一連の同一のカスタムメイドのユーザーコントロールを保持するリストボックスがあります。これらのコントロールは、実行時にリストボックスに追加されます。現在、リストボックスの項目は、最初の作成とコントロールへの挿入時に適切にサイズ変更されています。
ここが奇妙な部分です。リストボックスのサイズを変更すると、以前に表示されていたコントロールが新しいリストボックスの幅にサイズ変更されません。つまり、12 個のコントロールを追加し、ボックスに 4 つしか表示されない場合 (残りはスクロールバーによって隠されています)、ボックスのサイズを変更すると、最初の 4 つのコントロールは元の幅のままになり、スクロールすると他の 8 つが正しいサイズ。また、リスト項目を何らかの方法で操作すると、自動的に適切な幅にサイズ変更されます。EDIT2を参照してください
sizeChanged イベントにアタッチして、リストボックスとアイテムの両方で次を発行しようとしましたが、効果がありませんでした。リストボックス項目のレイアウト情報をリセットする方法を見つける必要があると思いますが、コマンドが見つかりません。
item.InvalidateArrange();
item.InvalidateMeasure();
Layers.UpdateLayout();
item.UpdateLayout();
これは、追加しているアイテムと関係があると思います。アイテムをリスボックスから切り離してから取り付けても、幅が間違っているためです。
ここに私のリストボックスコードがあります:
<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:問題の原因はわかっていますが、解決方法がわかりません。起こっているのは、サイズ変更中にスライダーの値を変更しない限り、ユーザーコントロールにあるスライダーのサイズが残りのコントロールと一緒に変更されないことです。その値を少しでも変更すると、自動的にサイズが変更されます。強制的にサイズ変更するにはどうすればよいですか?