Масштабирование рендеринга и преобразования данных в Silverlight 2 Beta 2 - PullRequest
1 голос
/ 26 августа 2008

Кто-нибудь знает, возможно ли связать 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.

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

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 - я хочу масштабировать размер рыбы в зависимости от прозрачности воды. Так что я не думаю, что это проблема с типом, с которым я связываюсь ...

Ответы [ 7 ]

1 голос
/ 26 августа 2008

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

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

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

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

1 голос
/ 26 августа 2008

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

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

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

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

0 голосов
/ 26 августа 2008

Я надеялся решить эту проблему с помощью 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;
    }
0 голосов
/ 26 августа 2008

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

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

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

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

0 голосов
/ 26 августа 2008

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

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

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

myScaler.DataContext = fishImage.DataContext;

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

0 голосов
/ 26 августа 2008

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

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

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

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

Если это сработает, то, по крайней мере, это поможет вам.

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

0 голосов
/ 26 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...