【发布时间】:2018-07-20 13:35:27
【问题描述】:
我有一系列矩形,用户可以通过将图像拖入其中来添加图像。 然后按比例缩小图像,然后用 ImageBrush 填充矩形。
我需要用户能够操纵矩形内的图像以满足他们的需求。就像任何照片拼贴应用一样。
我的问题是:如何在矩形顶部显示完整的、未屏蔽的图像,以便用户可以根据需要对其进行操作?我不知道从哪里开始。
private async void Mask_Drop(object sender, DragEventArgs e)
{
Rectangle maskSq = e.OriginalSource as Rectangle;
var maskW = maskSq.Width.ToSingle();
var maskH = maskSq.Height.ToSingle();
double maskX = Canvas.GetLeft(maskSq);
double maskY = Canvas.GetTop(maskSq);
// Image sizes for bounding to mask
float boundH = Convert.ToSingle(size.Height);
float boundW = Convert.ToSingle(size.Width);
maskSq.Fill = new ImageBrush
{
ImageSource = new BitmapImage(new Uri("ms-appdata:///local/" + SelectedImage.Name, UriKind.Absolute)),
Stretch = Stretch.UniformToFill
};
}
private void Tap_Collage(object sender, TappedRoutedEventArgs e)
{
//Gets the full image from ImageBrush
ImageBrush brush = (ImageBrush)(((Rectangle)sender).Fill);
Rectangle rect = sender as Rectangle;
//Mask sure rectangle does not drag, just the image brush
rect.CanDrag = false;
rect.StrokeThickness = 6;
//Drag Image Functionality
rect.ManipulationDelta += ImageManipulation.Resize_ImageEdit;
ImageManipulation.ImageEdit_Drag = new TranslateTransform();
brush.Transform = ImageManipulation.ImageEdit_Drag;
//Zoom Image Functionality
ImageManipulation.ImageEdit_Zoom = new ScaleTransform();
brush.RelativeTransform = ImageManipulation.ImageEdit_Zoom;
}
类
public static class ImageManipulation
{
public static TranslateTransform ImageEdit_Drag;
public static ScaleTransform ImageEdit_Zoom;
public static RotateTransform ImageEdit_Rotate;
public static void Resize_ImageEdit(object sender, ManipulationDeltaRoutedEventArgs e)
{
ImageEdit_Drag.X += e.Delta.Translation.X;
ImageEdit_Drag.Y += e.Delta.Translation.Y;
ImageEdit_Zoom.ScaleX *= e.Delta.Scale;
ImageEdit_Zoom.ScaleY *= e.Delta.Scale;
if (ImageEdit_Zoom.ScaleX < 1.0)
{
ImageEdit_Zoom.ScaleX = 1.0;
ImageEdit_Zoom.ScaleY = 1.0;
}
ImageEdit_Rotate.Angle += e.Delta.Rotation;
}
}
XAML
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:CollageGrid">
<Rectangle Width="{Binding CollageW}" Height="{Binding CollageH}" AllowDrop="True" CanDrag="True" Fill="Transparent"
Drop="Mask_Drop"
DragOver="Mask_DragOver"
ManipulationMode="TranslateX, TranslateY" Stroke="Black" StrokeThickness="2" DragEnter="Mask_DragEnter" DragLeave="Mask_DragLeave" Tapped="Tap_Collage">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding CollageX}" Y="{Binding CollageY}"/>
</Rectangle.RenderTransform>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
我希望实现的示例:
目前的样子:
【问题讨论】:
-
我现在没有答案,但也许你可以在矩形之外使用一些效果,比如模糊。我想你可以看看 Windows Community Toolkit
-
向 imageBrush 添加模糊效果很好,也很简单。但是,我的问题是我不知道如何访问矩形之外的图像部分。默认情况下,矩形会“屏蔽”图像的任何多余部分,因此图像中唯一可见的部分是实际适合矩形的区域......如果有意义的话。
-
所以你的问题是操作图像以适应矩形?你试试Manipulation events吗?
-
好的,我已经设法使用操作三角化解决了一半的问题,我现在可以拖动和编辑 imageBrush。问题是我仍然无法弄清楚如何直观地显示矩形边界之外的 ImageBrush 区域,这是一个小问题,但却是必要的。
-
@AdamMcMahon 我不确定您的 Xaml 现在看起来的细节是什么,也许我迷失了您的方向。但是你可以试试社区工具包上的BackdropBlurBrush。