Silverlight 2 Beta 2中的Databind RenderTransform缩放

时间:2020-03-05 18:43:08  来源:igfitidea点击:

有人知道是否有可能在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. 我想根据水的透明度来缩放鱼的大小。所以我认为我要绑定的类型没有问题...

解决方案

回答

是运行时错误还是编译时,乔纳斯(Jonas)?查看文档,ScaleX和ScaleY是依赖项属性,因此我们应该能够编写

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

...其中Foo和Bar是适当的类型。

编辑:当然,那是WPF文档。我想他们可能已经将ScaleX和ScaleY更改为标准属性,而不是Silverlight中的依赖项属性。我希望听到更多关于我们看到的错误的信息。

回答

嗯,我想我明白问题了。我们正在尝试将可见性(SelectedDive.Visibility)类型的属性绑定到Double(ScaleTransform.ScaleX)类型的属性。 WPF / Silverlight无法在这两种类型之间转换。

你想达到什么目的?也许我可以使用XAML。什么是" SelectedDive",当其可见性更改时,我们想发生什么?

回答

抱歉,正在寻找答案,所以我不知道我们使用更多信息来编辑问题。

好,可见性是Double类型的,因此绑定应在这方面起作用。

解决方法是,我们是否可以尝试将ScaleX和ScaleY值直接绑定到SelectedDive.Visibility绑定到的滑块控件?就像是:

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

如果这行得通,那么至少可以。

编辑:啊,我只是想起我曾经读过Silverlight在绑定中不支持ElementName语法,所以可能不起作用。

回答

是的,也许嵌入式渲染转换不会从它们应用于的对象继承DataContext。我们可以强制使用DataContext吗?例如,给转换命名:

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

...然后在代码背后:

myScaler.DataContext = fishImage.DataContext;

...这样缩放器肯定会与Image共享其DataContext。

回答

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

尝试添加以下内容:

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

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

回答

ScaleTransform没有数据上下文,因此绑定很可能正在寻找SelectedDive.Visibility不在自身之上而没有找到它。 Silverlight xaml和数据绑定中有很多与WPF不同的地方...

无论如何要解决此问题,我们都将需要在代码中设置绑定**,或者手动侦听数据对象的PropertyChanged事件,并在后面的代码中设置Scale。

如果我们想为缩放比例做动画/故事板,我会选择后者。

**我需要检查,但我们可能无法绑定到它。我记得如果RenderTransform不是动画的一部分,它将变为矩阵变换并且所有投注均关闭。

回答

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