Silverlight 2 Beta 2中的Databind RenderTransform缩放

时间:2008-08-26 02:40:08

标签: silverlight data-binding

任何人都知道是否可以在Silverlight 2 Beta 2中对渲染变换的ScaleX和ScaleY进行数据绑定?在WPF中可以进行绑定转换 - 但是在通过XAML在Silverlight中设置绑定时遇到错误。也许通过代码可以做到这一点?

<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>

我想绑定ScaleTransform元素的ScaleX和ScaleY。

当我尝试绑定数据上下文中的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 - 我想根据水的清晰度来缩放鱼的大小。所以我不认为这是我绑定的类型的问题......

7 个答案:

答案 0 :(得分:1)

是运行时错误还是编译时,Jonas?查看documentation,ScaleX和ScaleY是依赖项属性,因此您应该能够编写

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

......其中Foo和Bar属于合适的类型。

编辑:当然,这是WPF文档。我想他们可能已经将ScaleX和ScaleY更改为标准属性而不是Silverlight中的依赖属性。我很想知道你所看到的错误。

答案 1 :(得分:1)

ScaleTransform没有数据上下文,因此绑定最有可能是查找SelectedDive.Visibility,而不是找到它。 Silverlight xaml和数据绑定中有很多不同于WPF ...

无论如何要解决这个问题,你需要在代码**中设置绑定,或者手动监听数据对象的PropertyChanged事件,并在后面的代码中设置Scale。

如果您想为比例变化做动画/故事板,我会选择后者。

**我需要检查,但你可能无法绑定它。我记得如果RenderTransform不是动画的一部分,它会变成矩阵变换,所有的赌注都会关闭。

答案 2 :(得分:0)

啊我觉得我看到了你的问题。您正在尝试将类型为Visibility(SelectedDive.Visibility)的属性绑定到Double类型的属性(ScaleTransform.ScaleX)。 WPF / Silverlight无法在这两种类型之间进行转换。

你想要完成什么?也许我可以帮助你使用XAML。什么是“SelectedDive”,当它的可见性发生变化时你想要发生什么?

答案 3 :(得分:0)

抱歉 - 正在寻找答案计数,所以我没有意识到你已经编辑了更多信息的问题。

好的,因此Visibility的类型为Double,因此绑定应该在这方面起作用。

作为一种解决方法,您是否可以尝试将ScaleX和ScaleY值直接绑定到SelectedDive.Visibility绑定的滑块控件?类似的东西:

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

如果有效,那么至少可以帮助你。

编辑:啊,我记得曾经读过Silverlight不支持绑定中的ElementName语法,所以这可能不起作用。

答案 4 :(得分:0)

是的,嵌入式渲染变换可能不是从它们应用的对象继承DataContext。你能强制使用DataContext吗?例如,为变换命名:

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

...然后在你的代码隐藏中:

myScaler.DataContext = fishImage.DataContext;

...以便缩放器明确地与Image共享其DataContext。

答案 5 :(得分:0)

好的,Image本身是否正确地拾取了DataContext?

尝试添加此内容:

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

如果编译并运行,请将鼠标悬停在图像上,看它是否显示正确的值。

答案 6 :(得分:0)

我希望通过XAML解决这个问题,但事实证明Brian的建议是要走的路。我使用Matt的建议给比例转换一个名称,以便我可以从代码中访问它。然后我挂钩滑块的值更改事件,并手动更新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;
    }