有人知道是否可以在 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;
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top