Сведения о вопросе

Codeliver

13:17, 22nd August, 2020

Теги

Databind RenderTransform масштабирование в Silverlight 2 бета 2

Просмотров: 394   Ответов: 7

Кто-нибудь знает, можно ли привязать к базе данных 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}"/>

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

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



  Сведения об ответе

davran

03:18, 1st August, 2020

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

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

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

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


  Сведения об ответе

ITSME

21:06, 1st October, 2020

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

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

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

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


  Сведения об ответе

ITSME

03:54, 9th August, 2020

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

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


  Сведения об ответе

PROGA

03:39, 19th August, 2020

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

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

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

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

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

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


  Сведения об ответе

padenie

07:11, 22nd August, 2020

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

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

а потом в вашем коде-за спиной:

myScaler.DataContext = fishImage.DataContext;
...

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


  Сведения об ответе

COOL

12:28, 23rd August, 2020

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

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

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

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


  Сведения об ответе

PAGE

17:44, 14th August, 2020

Я надеялся решить эту проблему через XAML,но оказалось, что предложение Брайана было правильным. Я использовал предложение Мэтта, чтобы дать преобразованию масштаба имя, чтобы я мог получить доступ к нему из кода. Затем я подключил событие изменения значения ползунка и вручную обновил свойство ScaleX и ScaleY. Я сохранил свой конвертер значений для преобразования из диапазона видимости (0-30m) в масштаб (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;
    }


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться