Масштабирование RenderTransform привязки данных в Silverlight 2 Бета-версия 2

StackOverflow https://stackoverflow.com/questions/27303

  •  09-06-2019
  •  | 
  •  

Вопрос

Кто-нибудь знает, возможно ли привязать к данным scaleX и scaleY преобразования рендеринга в Silverlight 2 Beta 2?Преобразования привязки возможны в WPF, но я получаю сообщение об ошибке при настройке моей привязки в Silverlight через XAML.Может быть, это можно сделать с помощью кода?

<Image Height="60" HorizontalAlignment="Right" 
       Margin="0,122,11,0" VerticalAlignment="Top" Width="60" 
       Source="Images/Fish128x128.png" Stretch="Fill" 
       RenderTransformOrigin="0.5,0.5" x:Name="fishImage">
    <Image.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX="1" ScaleY="1"/>
             <SkewTransform/>
             <RotateTransform/>
             <TranslateTransform/>
         </TransformGroup>
    </Image.RenderTransform>
</Image>

Я хочу привязать scaleX и scaleY элемента ScaleTransform.

Я получаю ошибку времени выполнения, когда пытаюсь выполнить привязку к свойству double в моем контексте данных:

Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"

Моя привязка выглядит следующим образом:

<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}" 
                ScaleY="{Binding Path=SelectedDive.Visibility}"/>

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

Видимость имеет тип double и представляет собой число от 0.0 до 30.0.У меня есть преобразователь значений, который масштабирует это число до 0,5 и 1 - я хочу масштабировать размер рыбы в зависимости от прозрачности воды.Так что я не думаю, что это проблема с типом, к которому я привязываюсь...

Это было полезно?

Решение

ScaleTransform не имеет контекста данных, поэтому, скорее всего, привязка ищет SelectedDive.Visibility для себя и не находит его.В Silverlight xaml и привязке данных есть многое, что отличается от WPF...

В любом случае, чтобы решить эту проблему, вам нужно будет настроить привязку в коде ** или вручную прослушать событие PropertyChanged вашего объекта данных и установить Масштаб в коде позади.

Я бы выбрал последнее, если бы вы хотели сделать анимацию / раскадровку для изменения масштаба.

** мне нужно проверить, но, возможно, вы не сможете привязаться к нему.насколько я помню, если RenderTransform не является частью анимации, она превращается в матричное преобразование, и все ставки отменяются.

Другие советы

Это ошибка времени выполнения или во время компиляции, Джонас?Глядя на Документация, scaleX и scaleY являются свойствами зависимости, поэтому вы должны быть в состоянии написать

<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />

...где Foo и Bar имеют соответствующий тип.

Редактировать:Конечно, это документация WPF.Я полагаю, возможно, что они изменили scaleX и scaleY на стандартные свойства, а не на свойства зависимостей в Silverlight.Я бы хотел узнать больше об ошибке, которую вы видите.

А, кажется, я понимаю вашу проблему.Вы пытаетесь привязать свойство типа Visibility (SelectedDive.Visibility) к свойству типа Double (ScaleTransform.scaleX).WPF / Silverlight не может конвертировать между этими двумя типами.

Чего вы пытаетесь достичь?Может быть, я смогу помочь вам с XAML.Что такое "SelectedDive" и что вы хотите, чтобы произошло, когда изменится его видимость?

Извините - искал, чтобы увеличить количество ответов, поэтому я не понял, что вы отредактировали вопрос, добавив больше информации.

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

В качестве обходного пути не могли бы вы попробовать привязать свои значения scaleX и scaleY непосредственно к элементу управления slider, к которому привязан SelectedDive.Visibility?Что -то вроде:

<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... />

Если это сработает, то, по крайней мере, заставит вас двигаться дальше.

Редактировать:Ах, я только что вспомнил, что однажды прочитал, что Silverlight не поддерживает синтаксис ElementName в привязках, так что это может не сработать.

Да, возможно, встроенные преобразования рендеринга не наследуют DataContext от объекта, к которому они применяются.Можете ли вы принудительно ввести в них DataContext?Например, присвойте преобразованию имя:

<ScaleTransform x:Name="myScaler" ... />

...а затем в вашем коде-за:

myScaler.DataContext = fishImage.DataContext;

...таким образом, скалер определенно разделяет свой DataContext с Изображением.

Хорошо, правильно ли само изображение обрабатывает DataContext?

Попробуйте добавить это:

<Image Tooltip="{Binding SelectedDive.Visibility}" ... />

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

Я надеялся решить это с помощью XAML, но оказалось, что предложение Брайана было правильным решением.Я воспользовался предложением Мэтта присвоить преобразованию масштаба имя, чтобы я мог получить к нему доступ из кода.Затем я подключил событие изменения значения слайдера и вручную обновил свойство scaleX и scaleY.Я сохранил свой преобразователь значений для преобразования диапазона видимости (0-30 м) в масштаб (от 0,5 до 1).Код выглядит примерно так:

    private ScaleConverter converter;

    public DiveLog()
    {           
        InitializeComponent();

        converter = new ScaleConverter();
        visibilitySlider.ValueChanged += new 
          RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged);
    }        

    private void visibilitySlider_ValueChanged(object sender,   
                                        RoutedPropertyChangedEventArgs<double> e)
    {
        fishScale.ScaleX = (double)converter.Convert(e.NewValue, 
                                   typeof(double), null, CultureInfo.CurrentCulture);
        fishScale.ScaleY = fishScale.ScaleX;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top