2015-04-25 3 views
1

Я реализую поведение в своем приложении, которое изменит размер основной области содержимого в зависимости от размера экрана. (Область содержимого состоит из значков и других элементов, которые пользователь может разместить/рисовать)Применение преобразования ко всем дочерним элементам в WPF

В настоящее время свойство margin используется для позиционирования элементов с использованием преобразователя, который преобразует Point в Thickness.

Пример:

http://i.imgur.com/tom7ZKE.png

«Scaling» является то, что я буду за, где дочерние элементы «масштабируется», положение мудр, к размеру контейнера.

Как я могу применить преобразование (RenderTransform или LayoutTransform) для всех ребенка элементов сетки, так что позиции значка будут масштабироваться в правильное положение в зависимости от размера сетки?

Следует также отметить, что эти значки могут быть удалены/добавлены во время работы приложения. позиция всех элементов, которые необходимо масштабировать, не размер.

+0

Не будет здесь помощи «ViewBox»? – Jcl

+0

Вы пытаетесь просто масштабировать размер всех элементов или изменить только размер контейнера? – Domysee

+0

Размер контейнера изменится, а элементы _position_ будут масштабироваться. – Cyral

ответ

2

Я уже делал это раньше, и я хотел бы предложить вам сделать это:

  1. В классе элементов (скажем, Circle), вы какой-то координаты представляют свою позицию, пропорционально к размер контейнера. Таким образом, 0.5 будет представлять середину, 0.33 будет представлять одну треть влево и т. Д.
  2. Создайте IMultiValueConverter, который вычисляет координату пикселя на основе относительной координаты и размера контейнера по заданному размеру;
  3. Объявить свой объект в XAML с его полями (в случае сетки контейнера) или Canvas.Top/Left (в случае Canvas контейнера) следующим образом:

Xaml:

<Circle> 
    <Circle.Margin> 
     <MultiBinding Converter="{StaticResource ThatConverter}"> 
      <Binding ElementName="container" Path="ActualWidth"/> 
      <Binding Path="CircleCoordinateX"/> 
      <!-- The same for height and Y coordinate --> 
     </MultiBinding> 
    </Circle.Margin> 
</Circle> 

Вместо этого более упрощенного подхода, в идеале вы должны сделать свой контейнер, чтобы быть ItemsControl, создать ItemsTemplate для типа данных Circle и связать контейнер ItemsSource до некоторой ObservableCollection на некотором ViewModel, например.

+0

Спасибо, я попытаюсь реализовать это сейчас. – Cyral

+0

Завтра я буду на работе, и я могу скопировать-вставить образец рабочего кода, если вы все еще заинтересованы. – heltonbiker

+0

Извините, что не вернусь к вам, я, возможно, нашел другое решение (используя мой существующий конвертер PointToThickness для преобразования точки в маржу, похожую на вашу идею) Если я не могу сделать это до конца сегодняшнего дня Попробуй свой метод. – Cyral

Смежные вопросы