Ограничить ширину ContentPresenter для его динамического содержимого - PullRequest
0 голосов
/ 13 мая 2011

Я хотел бы иметь возможность динамически настраивать размер элемента управления содержимым.

Вот простой пример:

...
<Slider x:Name="width" Minimum="40" Value="100" Maximum="300"/>
...
<ContentPresenter Width="{Binding Value, ElementName=width}" Content="Some value">
   <ContentPresenter.ContentTemplate>
      <DataTemplate>
         <Grid MaxWidth="200" MinWidth="80">
            <Rectangle Fill="Wheat" />
            <TextBlock Text="{Binding}"/>
         </Grid>
      </DataTemplate>
   </ContentPresenter.ContentTemplate>
</ContentPresenter>

Учитывая этот пример, я бы хотел, чтобы ширина содержимого ContentPresenter оставалась в пределах минимальной и максимальной ширины его сгенерированного дочернего элемента (в данном случае 80 - 200).

Очевидно, с помощью простого примера, подобного этому, я мог бы просто изменить диапазон ползунка, но мой реальный сценарий более сложный. Я пытаюсь ограничить размер всплывающего экрана сгенерированным содержимым. Я не могу установить явный диапазон во всплывающем окне, потому что я понятия не имею, каким будет содержимое до этого. Содержание должно быть в состоянии ограничить себя.

К сожалению, MaxWidth и MinWidth для детей в значительной степени игнорируются. MinWidth приводит к обрезке, когда родительский элемент установлен меньше. MaxWidth приводит к множеству пустого пространства. Похоже, мне придется установить MaxWidth и MinWidth в том же месте, где я динамически обновляю значение Width.

1 Ответ

0 голосов
/ 13 мая 2011

Мое предложение будет состоять в том, чтобы заменить ContentPresenter настраиваемой панелью (альтернативно, заключить настраиваемую панель в ContentPresenter, если вы не можете заменить ее), которая выделяет нужный вам размер желаемым способом. Довольно легко и просто объявить класс, производный от Panel, а затем переопределить MeasureOverride и ArrangeOverride. В этом случае вы можете измерить все с помощью базового MeasureOverride, а затем просто назначить нужный размер в качестве доступного пространства. В ArrangeOverride просто назначьте прямой дочерний элемент вашей панели в качестве конечного размера панели (прямоугольник = 0,0, ширина, высота).

...