【问题标题】:Transforms on WriteableBitmapWriteableBitmap 上的转换
【发布时间】:2012-01-13 00:32:52
【问题描述】:

我正在 WP7 芒果中编写应用程序,并尝试将加载的图像从绑定加载到 XAML 中的 WriteableBitmap,例如:

<Grid>
    <ScrollViewer>
        <Image Source="{Binding SourceImage}">
            <Image.RenderTransform>
                <RotateTransform Angle="{Binding RotateAngle}"/>
            </Image.RenderTransform>
        </Image>
    </ScrollViewer>
</Grid> 

我在 ViewModel 中将 Angle 与我的属性 Angle 绑定,我从滑块更改此值但图像不旋转。提高属性改变是正确的。 当我使用从内容文件加载的图像、静态图像时,它可以工作。

【问题讨论】:

    标签: c# xaml windows-phone-7


    【解决方案1】:

    真的很奇怪。我还不明白问题出在哪里,但你可以使用 Projection 而不是 RenderTransform:

    <Grid>
       <ScrollViewer>
           <Image Source="{Binding SourceImage}">
               <Image.Projection>
                   <PlaneProjection RotationZ="{Binding RotateAngle}" />
               </Image.Projection>
           </Image>
       </ScrollViewer>
    </Grid> 
    

    编辑:

    好的,实际上问题似乎来自 ScrollViewer 而不是 Image。直接在 ScrollViewer 上设置 RotateTransform,它应该可以工作:

    <Grid>
       <ScrollViewer>
           <ScrollViewer.RenderTransform>
               <RotateTransform Angle="{Binding RotateAngle}" />
           </ScrollViewer.RenderTransform>
           <Image Source="{Binding SourceImage}" />
       </ScrollViewer>
    </Grid> 
    

    或者将图像放在 ScrollPanel 内的 Grid 中:

        <ScrollViewer>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
    
                <Image Source="{Binding SourceImage}">
                    <Image.RenderTransform>
                        <RotateTransform Angle="{Binding RotateAngle}" />
                    </Image.RenderTransform>
                </Image>
            </Grid>
        </ScrollViewer>
    

    但我仍然不知道为什么会发生这种情况。

    编辑 2:

    好的,我发现了错误。它已在最后的 WP7 版本中引入。基本上,滚动查看器将覆盖其子项的 RenderTransform,如果它与它自己的不同。 所以你有三个解决方案:

    • 直接在 ScrollViewer 上定义 RenderTransform
    • 将您的子元素包装在一个虚拟容器元素中。这样,虚拟元素的 rendertransform 会被覆盖,而不是你的:
    • 在初始化时,将 ScrollViewer 的 RotateTransform 替换为元素的:

      public MainPage()
      {
          this.InitializeComponent();
      
          this.ScrollViewer.RenderTransform = this.Image.RenderTransform;
      }
      

    我个人会选择第一个或第二个解决方案。我担心第三种解决方案可能会产生意想不到的副作用。

    【讨论】:

    • 非常感谢!我选择了将图像放在 ScrollPanel 内的 Grid 中的方式。效果很好
    • 您也应该开始接受答案。 0% 的回答率,人们很快就会停止回答你...
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多