Silverlight 2 Beta 2中的Databind RenderTransform缩放
有人知道是否有可能在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; }