Silverlight 2 Beta 2 中的数据绑定 RenderTransform 缩放
-
09-06-2019 - |
题
有人知道是否可以在 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。
当我尝试绑定数据上下文上的双属性时,出现运行时错误:
Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"
我的绑定看起来像这样:
<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}"
ScaleY="{Binding Path=SelectedDive.Visibility}"/>
我已经三重验证绑定路径是正确的 - 我将滑动条绑定到相同的值并且效果很好......
Visibility 的类型为 double,是 0.0 到 30.0 之间的数字。我有一个值转换器,可以将该数字缩小到 0.5 和 1 - 我想根据水的透明度来缩放鱼的大小。所以我不认为我所绑定的类型有问题......
解决方案
ScaleTransform 没有数据上下文,因此绑定很可能正在寻找自身的 SelectedDive.Visibility 而没有找到它。Silverlight xaml 和数据绑定中有很多与 WPF 不同的地方...
无论如何,要解决这个问题,您需要在代码中设置绑定**,或者手动侦听数据对象的 PropertyChanged 事件并在后面的代码中设置比例。
如果您想为比例变化制作动画/故事板,我会选择后者。
** 我需要检查,但你可能无法绑定它。我记得如果 RenderTransform 不是动画的一部分,它就会变成矩阵变换,所有的赌注都会被取消。
其他提示
这是运行时错误还是编译时错误,乔纳斯?看着 文档, 、 ScaleX 和 ScaleY 是依赖属性,因此您应该能够编写
<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />
...其中 Foo 和 Bar 属于适当的类型。
编辑:当然,这是 WPF 文档。我认为他们可能已将 ScaleX 和 ScaleY 更改为标准属性,而不是 Silverlight 中的依赖属性。我很想了解更多有关您所看到的错误的信息。
啊,我想我看到了你的问题。您正在尝试将 Visibility 类型 (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;
...这样缩放器肯定与图像共享其 DataContext。
好的,图像本身是否正确获取了 DataContext?
尝试添加这个:
<Image Tooltip="{Binding SelectedDive.Visibility}" ... />
如果编译并运行,请将鼠标悬停在图像上并查看它是否显示正确的值。
我希望通过 XAML 解决这个问题,但事实证明 Brian 的建议是可行的方法。我使用 Matt 的建议为比例变换命名,以便我可以从代码中访问它。然后我挂钩了滑块的值更改事件,并手动更新 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;
}