2008-08-26 50 views
1

任何人都知道是否可以绑定Silverlight 2 Beta 2中的渲染转换的ScaleX和ScaleY?在WPF中绑定转换是可能的 - 但是在通过XAML设置Silverlight中的绑定时发生错误。也许有可能通过代码来完成它?Databind RenderTransform Silverlight 2 Beta 2中的缩放

<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}"/> 

我有三重验证绑定路径是正确的 - 我绑定的滑动条反对相同的值,并且工作得很好...

可见性类型为double,并且是介于0.0和30.0之间的数字。我有一个价值转换器,将这个数字缩小到0.5和1 - 我想根据水的清晰度缩放鱼的尺寸。所以我不认为这是我绑定类型的问题...

回答

1

ScaleTransform没有数据上下文,所以最有可能的是绑定正在寻找SelectedDive.Visibility,而不是找到它。有很多与Silverlight xaml和数据绑定不同的WPF ...

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

我会选择后者,如果你想做一个动画/故事板的规模变化。

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

1

是运行时错误还是编译时间,Jonas?纵观documentation,将scaleX和scaleY依赖属性,所以你应该能够编写

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

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

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

0

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

你想完成什么?也许我可以帮助你使用XAML。什么是“SelectedDive”,当其可见性发生变化时,您希望发生什么?

0

对不起 - 正在寻找答案,因此我没有意识到你已经编辑了更多信息的问题。

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

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

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

如果这样的话,那么它至少会让你去。

编辑:啊,我只记得我曾经读过Silverlight不支持绑定中的ElementName语法,所以这可能无法正常工作。

0

是的,也许嵌入的渲染变换没有从它们应用的对象继承DataContext。你能强制DataContext进入他们吗?例如,给变换名称:

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

...,然后在后台代码:

myScaler.DataContext = fishImage.DataContext; 

...使定标器绝对赞同其与图像的DataContext。

+0

我不认为你可以给变换标签名称 – Neo42 2009-07-17 11:45:55

0

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

尝试添加此:

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

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

0

我曾希望通过XAML来解决这个问题,但事实证明,Brian的建议是最好的选择。我使用马特的建议来给规模变换一个名字,以便我可以从代码访问它。然后,我钩住滑块的值更改事件,并手动更新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; 
    }