Привязка масштабирования к размеру элемента управления - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть Canvas с некоторыми изображениями (размером 24x24), а также полоса прокрутки, которая увеличивает и уменьшает холст.

Я бы хотел, чтобы при изменении размера холста изображения оставались одинакового размера, поэтому я подумал о привязке ширины / высоты изображений к значению масштабирования, чтобы их ширина / высота зависела от значения масштабирования (поэтому например, они будут Width = Width / ZoomValue или что-то подобное)

Как я могу получить это поведение, используя WPF и привязку?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Предполагая, что все изображения имеют ширину 24, свяжите их с ZoomValue и используйте IValueConverter:
(ZoomValue должен быть на вашей ViewModel)

<Image Source="..." Width="{Binding ZoomValue, Converter={StaticResource ZoomToWidthConverter}" />

И IValueConverter:

public class ZoomToWidthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Double imgOriginalWidth = 24;
            return imgOriginalWidth / System.Convert.ToDouble(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Double imgOriginalWidth = 24;
            return System.Convert.ToDouble(value) * imgOriginalWidth;
        }
}

Ресурсы Canvas должны содержать ключ для ZoomToWidthConverter:

<Canvas>
<Canvas.Resources>
<local:ZoomToWidthConverter x:Key="ZoomToWidthConverter " />
</Canvas.Resources>
</Canvas>

Если изображения могут иметь разную оригинальную ширину, используйте MultiBinding вместе с IMultiValueConverter.

1 голос
/ 26 декабря 2011

Не совсем уверен, есть ли какие-то встроенные встроенные функции по этому вопросу уже в WPF 4.0, также потому, что эта функция была запрошена пользователями много лет назад. Единственное ценное решение, imo, которое вы можете применить, это назначить childcontrol.RenderTransform на инверсию transformation matrix его родителя, поэтому canvas.

Позвольте привязке данных назначить правильное значение

Делая это, надеюсь, это понятно, вы сбрасываете преобразование, примененное к холсту, и получаете «старую» матрицу. Учитывая, что вы говорите о однократном преобразовании (нет последовательности, сделанной Translation, Scale и Rotation), вы должны получить математически предсказуемую (настолько правильную) «оригинальную» матрицу (они назовите это Identity).

Посмотрите на этот ответ, который снова относится к другому.

Надеюсь, это поможет.

1 голос
/ 26 декабря 2011

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

  1. http://www.wpftutorial.net/ValueConverters.html
  2. http://blogs.imeta.co.uk/FMoreno/archive/2008/11/07/498.aspx

Надеюсь, это поможет!

...