Хорошо, вот мой код. Обратите внимание, что StackPanel находится непосредственно в UserControl.
<UserControl>
<StackPanel Orientation="Horizontal">
<ScrollViewer Width="450"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled">
<Rectangle Width="400" Height="4000" Fill="BlanchedAlmond"/>
</ScrollViewer>
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled">
<ItemsControl BorderBrush="Green"
BorderThickness="2"
ItemsSource="{Binding Path=MyObservableCollection}"
ItemTemplate="{StaticResource FatTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
</StackPanel>
</UserControl>
(Код ИЗМЕНЕНО)
Обратите внимание, что прямоугольник присутствует только потому, что содержимое этого средства просмотра прокрутки не имеет значения.
Проблема в том, что WrapPanel просто расширяется по горизонтали и не переносится ...
Я нашел несколько решений:
Предоставление абсолютной ширины WrapPanel (но тогда она не изменяется вместе с окном).
Привязка ширины к родительской ширине - ItemsControl или ScrollViewer (ScrollViewer работал лучше в такой ограниченной ситуации).
Width="{Binding RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=ActualWidth}"
Проблема с этим методом заключается в том, что если элемент управления находится рядом с ним в StackPanel или Grid, вам необходимо привязать его к его родительскому размеру за вычетом элемента управления рядом с ним. Затем идет самое сложное. Я построил конвертер, который применяет математические операции к полученному числу, чтобы я мог вычесть заданную ширину из его родительской ширины:
Width="{Binding RelativeSource=
{RelativeSource FindAncestor,
AncestorType={x:Type UserControl}},
Path=ActualWidth,
Converter={StaticResource Convertisseur_Size_WXYZ},
ConverterParameter=-260}"
Но все же, поскольку вы не можете привязать значение, которое передаете в ConverterParameter,
ConverterParameter={Binding ...} (doesn't work)
Я хочу:
- чтобы иметь возможность изменять размер моего приложения с помощью моего WrapPanel и ScrollViewer, меняя размер,
- мой UserControl должен быть легко обслуживаемым,
- мой код чище, чем эти большие выражения привязки, которые полагаются на тип родительского элемента управления.
Какое решение лучше?
Примечание: если что-то непонятно, могу добавить подробности.