【问题标题】:Databind RenderTransform Scaling in Silverlight 2 Beta 2Silverlight 2 Beta 2 中的 Databind RenderTransform 缩放
【发布时间】:2010-09-06 20:07:33
【问题描述】:

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

【问题讨论】:

    标签: silverlight data-binding


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这是运行时错误还是编译时错误,Jonas?看documentation,ScaleX和ScaleY是依赖属性,应该可以写

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

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

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

          【讨论】:

            【解决方案5】:

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

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

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

            myScaler.DataContext = fishImage.DataContext;
            

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

            【讨论】:

            • 我认为你不能给转换标签命名
            【解决方案6】:

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

            尝试添加这个:

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

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

            【讨论】:

              【解决方案7】:

              我希望通过 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;
                  }
              

              【讨论】:

                猜你喜欢
                • 2013-10-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-01
                • 1970-01-01
                • 2018-10-18
                相关资源
                最近更新 更多