关于数据绑定:Silverlight 2 Beta 2中的Databind RenderTransform缩放

关于数据绑定:Silverlight 2 Beta 2中的Databind RenderTransform缩放

Databind RenderTransform Scaling in Silverlight 2 Beta 2

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<Image Height="60" HorizontalAlignment="Right"
       Margin="0,122,11,0" VerticalAlignment="Top" Width="60"
       Source="Images/Fish128x128.webp" 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属性时,出现运行时错误:

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

我的绑定看起来像这样:

1
2
<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事件,并在后面的代码中设置Scale。

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

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


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

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

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

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


我希望通过XAML解决此问题,但事实证明Brian的建议是要走的路。我使用了Matt的建议来给scale转换命名,以便可以从代码中访问它。然后,我钩住了滑块的值更改事件,并手动更新了ScaleX和ScaleY属性。我保留了值转换器,以将可见性范围(0-30m)转换为比例(0.5到1)。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    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;
    }

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

尝试添加以下内容:

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

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


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

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

...然后在您的代码背后:

1
myScaler.DataContext = fishImage.DataContext;

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


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

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

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

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

如果这行得通,那么至少会帮助您。

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


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

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


推荐阅读