任何人都知道是否可以在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 - 我想根据水的清晰度来缩放鱼的大小。所以我不认为这是我绑定的类型的问题......
答案 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;
}