【发布时间】:2017-06-14 01:44:44
【问题描述】:
我正在尝试找到一种方法来剪辑带有椭圆的图像,以便如果我缩放图像,我会保持椭圆完整,但到目前为止我还没有运气。
这是我的 XAML:
<Grid>
<Grid.Clip>
<RectangleGeometry x:Name="ClippingRectangle"
Rect="0,0,200,200"/>
</Grid.Clip>
<Ellipse Stretch="UniformToFill"
x:Name="ImageEllipse"
SizeChanged="ImageEllipse_OnSizeChanged">
<Ellipse.Fill>
<ImageBrush ImageSource="{x:Bind ViewModel.SomePath}>
</Ellipse.Fill>
</Ellipse>
</Grid>
我正在使用SizeChanged 事件来更新剪切矩形的大小。
问题是这样外部Grid 剪辑Ellipse,连同它的图像,所以结果是一个带有裁剪边缘的缩放圆。
相反,我只想在椭圆内部缩放图像。
问题在于Ellipse 控件是一个形状,因此我无法在其中添加实际的Image 控件并改为缩放该控件。
有没有办法真正做到这一点,或者由于微软决定将剪辑属性限制为 RectangleGeometry 对象,所以没有办法做到这一点?
使用Border 时会出现同样的问题,因为CornerRadius 属性仅适用于其背景,实际上并不会剪辑其内容。
谢谢!
EDIT #1 - 根据要求,这是我在缩放 Ellipse 时得到的结果:
EDIT #2 - 我尝试像这样为ImageBrush 设置动画:
<ImageBrush.Transform>
<ScaleTransform x:Name="AvatarTransform"
CenterY="0.5"
CenterX="0.5"/>
</ImageBrush.Transform>
</ImageBrush.Transform>
然后:
<Storyboard x:Name="TestAnimation">
<DoubleAnimation Storyboard.TargetName="AvatarTransform"
Storyboard.TargetProperty="ScaleY"
To="1.2" Duration="0:0:1"/>
</Storyboard>
但由于某种原因似乎没有发生任何事情,我什至不确定是否真的可以为 Brush 的 Transform 属性设置动画,因为它不是 UIElement 对象
EDIT #4 - 从两个答案中,我尝试像这样再次为 ImageBrush.Translate 属性设置动画:
<!--Image XAML-->
<ImageBrush Stretch="Fill"
ImageSource="/SomeImage.jpg">
<ImageBrush.Transform>
<CompositeTransform x:Name="MyTransform"/>
</ImageBrush.Transform>
</ImageBrush>
<!--Image storyboard-->
<Storyboard x:Name="ScaleStory">
<DoubleAnimation Storyboard.TargetName="MyTransform"
Storyboard.TargetProperty="ScaleX"
From="1" To="1.4" Duration="0:0:1"/>
</Storyboard>
但它仍然无法正常工作。另外,使用这种方法我无法设置RenerTransformOrigin 属性,因为我没有UIElement 可以使用,所以即使动画确实有效,图像也会向右和向下缩放,这不是预期的结果。
编辑 #4 >> 已解决! - 如标记为有效的答案所示,这是我的代码:
<Ellipse Stretch="UniformToFill"
x:Name="ImageEllipse">
<Ellipse.Fill>
<ImageBrush ImageSource="/SomePath/SomeImage.jpg">
<ImageBrush.RelativeTransform>
<CompositeTransform CenterY="0.5"
CenterX="0.5"/>
</ImageBrush.RelativeTransform>
</ImageBrush>
</Ellipse.Fill>
</Ellipse>
事实证明它也适用于 Ellipse.Fill 属性,所以我不必切换到 PathGeometry 来创建剪辑图像的圆圈。
【问题讨论】:
-
你能提供屏幕实际结果吗?
-
你不能只使用
ImageBrush.Transform来转换图像吗? -
@AndriiKrupka 我已经用请求的图片更新了问题
-
@DecadeMoon 我为动画使用 UI.Composition 命名空间,所以我没有考虑到这一点。我尝试使用简单的 DoubleAnimation,但仍然没有运气(请参阅更新的问题)
-
提供一些具有预期结果的图像。很难理解你在 final/ 中想要什么
标签: c# xaml windows-runtime uwp windows-10-universal