Создание WrapPanel с учетом ширины его родителя

Хорошо, вот мой код. Обратите внимание, что 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>

( Code EDITED )

Обратите внимание, что прямоугольник присутствует только потому, что содержимое этого средства просмотра прокрутки не имеет значения.

Проблема в том, что WrapPanel просто расширяется по горизонтали и не переносится ...

Я нашел несколько решений:

  1. Предоставление абсолютной ширины WrapPanel (но тогда она не изменяется вместе с окном).

  2. Привязка ширины к его родительская ширина - ItemsControl или ScrollViewer (ScrollViewer работал лучше в такой ограниченной ситуации).

     Width = "{Binding RelativeSource =
      {RelativeSource FindAncestor,
      AncestorType = {x: Type ScrollViewer}},
      Путь = 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, чтобы было легко поддерживать,
  • мой код чище, чем эти большие выражения привязки, которые полагаются на тип родительского элемента управления.

Что лучшее решение?

Примечание: Если что-то неясно, я могу добавить детали.

7
задан Jonathan Johansen 17 January 2019 в 07:15
поделиться