Принудительно привязать Предмет, чтобы он был последним в строке или в начале новой строки WrapPanel - PullRequest
0 голосов
/ 31 января 2020

Я пытался решить эту проблему в течение нескольких дней, но, похоже, не могу найти решение, если оно вообще есть. Я начинаю думать, что не смогу сделать эту работу, моя проблема: у меня есть WrapPanel, содержащая связанные элементы, а таблица данных для этих элементов - это изображение, которое я выбираю в зависимости от привязанного элемента. Пользователь может изменять порядок элементов путем перетаскивания. Оболочка находится в окне с изменяемым размером. Я хотел бы дать пользователю возможность выбрать, является ли изображение последним в строке или оно должно начинаться с новой строки. ( Только один из этих вариантов должен работать, я доволен либо ... )

Пример, который я пытаюсь получить, "A" будет нормальным изображением, «B» будет изображение с измененной настройкой пользователя, | обозначает ширину окна

|A A A B       |<--- somehow make B last in line
|A A A A A A A |<--- autowrap due to screen width
|A A A A A B   |<--- somehow make B last in line
|A A           |

ИЛИ

|A A A A       |
|B A A A A A A |<--- somehow make B start a new line + autowrap due to screen width
|A A A A A A   |
|B A           |<--- somehow make B start a new line

Вот фрагмент кода WrapPanel:

<WrapPanel>
   <WrapPanel.Resources>
     <Style TargetType="Image">
           <Setter Property="Height" Value="23" />
           <Setter Property="Margin" Value="2" />
      </Style>
   </WrapPanel.Resources>
   <ItemsControl ItemsSource="{Binding Items}"}>
        <ItemsControl.ItemTemplate>
             <DataTemplate>
                 <Image Source={Binding DisplayedImage}>
                      <Image.ContextMenu>
                            ----Snip----
                      </Image.ContextMenu>
                </Image>
              </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                    <WrapPanel/>
              </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
     </ItemsControl>
</WrapPanel>

То, что я пробовал:

1) Добавление обычного параметра, текстового поля с Text = "" к DataTemplate, но показывать его только в том случае, если привязанное значение Item равно true

<DataTemplate>
   <StackPanel Orientation="Horizontal">
      <Image Source={Binding DisplayedImage}>
         <Image.ContextMenu>
            ----Snip----
         </Image.ContextMenu>
       </image>
       <TextBlock Text="&#xD;" Visibility="{Binding ForceNewLine, Converter={StaticResource boolToVis}}"/>
   </StackPanel>
</DataTemplate>

Не действительно сделайте что-нибудь для меня.

2) Добавление опции из: { ссылка }, отображается только в том случае, если привязанное значение Item истинно

<DataTemplate>
   <StackPanel Orientation="Horizontal">
      <Image Source={Binding DisplayedImage}>
         HERE OR... <local:NewLine Height="0" Visibility="{Binding ForceNewLine, Converter={StaticResource boolToVis}}"/>
         <Image.ContextMenu>
            ----Snip----
         </Image.ContextMenu>
       </image>
       HERE <local:NewLine Height="0" Visibility="{Binding ForceNewLine, Converter={StaticResource boolToVis}}"/>
   </StackPanel>
</DataTemplate>

Если я помещу элемент новой строки до моего изображения, это действительно очень близко к желаемому результату, это выглядит так:

|A A A A       |
|              |
|B A A A A A A |<-- B with newline before it
|A A A A A A   |
|              |
|B A           |<-- B with newline before it

Так что же здесь происходит, "новая строка" занимает ширину всей обертки, чтобы заполнить новую строку. Однако было бы неплохо, если бы новая строка не занимала целую строку ... Она имеет высоту = 0, но не влияет на это.

Если я поставлю новую строку после my image тогда изображение просто получает свою собственную линию:

|A A A A       |
|B             |<-- B with newline after it
|A A A A A A   |
|B             |<-- B with newline after it
|A A A A       |

Я также пытался играть с полем, но это либо ничего не делает, либо имеет тот же эффект, что и перевод строки после.

Другой вариант, который я рассматриваю, позволяет пользователю выбирать ширину этого элемента новой строки (для каждого элемента отдельно), я думаю, что если пользователь затем выберет ширину, которая заставит только следующее изображение перейти к следующей строке, потому что больше нет пробел на текущей строке, это работает. Но я бы предпочел не использовать эту опцию, потому что это довольно хлопотно для пользователя.

Редактировать: опция, позволяющая пользователю добавлять работы из газет, но не очень элегантная. Если бы я мог заставить элемент новой строки найти свою собственную позицию и динамически установить его собственную ширину на основе максимальной ширины собственной позиции окна MINUS, то это могло бы работать, я думаю, но я понятия не имел, как заставить это работать, и он должен работать динамически ...

Хотелось бы услышать некоторые идеи, и если это вообще возможно.

Спасибо!

...