1

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

4

7 回答 7

1

是运行时错误还是编译时错误,乔纳斯?查看文档,ScaleX 和 ScaleY 是依赖属性,所以你应该可以写

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

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

编辑:当然,那是 WPF 文档。我想他们可能已将 ScaleX 和 ScaleY 更改为标准属性,而不是 Silverlight 中的依赖属性。我很想听到更多关于你看到的错误的信息。

于 2008-08-26T02:43:45.543 回答
1

ScaleTransform 没有数据上下文,因此绑定很可能正在寻找 SelectedDive.Visibility 关闭它的自身而不是找到它。Silverlight xaml 和数据绑定中有很多与 WPF 不同...

无论如何,要解决这个问题,您需要在代码中设置绑定**,或者手动侦听数据对象的 PropertyChanged 事件并在后面的代码中设置 Scale。

如果您想为比例更改制作动画/故事板,我会选择后者。

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

于 2008-08-26T06:15:17.267 回答
0

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

你想达到什么目的?也许我可以帮助你处理 XAML。什么是“SelectedDive”,当它的 Visibility 发生变化时你希望发生什么?

于 2008-08-26T03:18:30.623 回答
0

抱歉 - 正在寻找答案计数,所以我没有意识到你已经用更多信息编辑了这个问题。

好的,所以 Visibility 是 Double 类型,所以绑定应该在这方面起作用。

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

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

如果这行得通,那么它至少会让你继续前进。

编辑:啊,我只记得我曾经读到 Silverlight 不支持绑定中的 ElementName 语法,所以这可能行不通。

于 2008-08-26T04:12:58.013 回答
0

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

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

...然后在您的代码隐藏中:

myScaler.DataContext = fishImage.DataContext;

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

于 2008-08-26T04:28:06.387 回答
0

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

尝试添加这个:

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

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

于 2008-08-26T04:51:09.200 回答
0

我希望通过 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;
    }
于 2008-08-26T06:32:58.270 回答