uwp - UWP - 如何在拖放过程中更改拖动图像的大小?
问题描述
我正在尝试拖放存在于 Viewbox 中的 UI 元素。一旦拖动过程开始,预期的图像就会显示用于拖动操作,但图像是全尺寸的,而不是 Viewbox 中显示的图像大小。
有没有办法让拖动图像自动尊重源元素的显示大小?如果没有,有没有办法以编程方式更改拖动图像的大小以匹配被拖动的 UI 元素的显示大小?
我在 DragStartingEventArgs 的 DataPackage 或 DragUI 中看不到任何允许调整拖动图像大小的选项。
被拖动的 UI 元素是一个 RelativePanel,其中包含许多嵌入的图像和形状。
解决方案
好的,所以这有点hacky,但它似乎运作良好。有很多改进可以完成,但这里有一种方法可以完成它。
private async void OnDragStarting(UIElement sender, DragStartingEventArgs args)
{
var relativePanel = (RelativePanel) sender;
var ellipse = (Ellipse)relativePanel.Children.ToList()[0];
var deferral = args.GetDeferral();
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(ellipse);
// convert the ellipse to a pixel array
var pixelBuffer = await bitmap.GetPixelsAsync();
var pixelArray = pixelBuffer.ToArray();
var stream = new InMemoryRandomAccessStream();
var img = new BitmapImage();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Straight,
(uint)bitmap.PixelWidth,
(uint)bitmap.PixelHeight,
96,
96,
pixelArray);
// now that there is an encoder set up, set the new size of the image
encoder.BitmapTransform.ScaledHeight = 50;
encoder.BitmapTransform.ScaledWidth = 50;
await encoder.FlushAsync();
await img.SetSourceAsync(stream);
args.DragUI.SetContentFromBitmapImage(img);
deferral.Complete();
}
推荐阅读
- python - 如何在 Python 中用 selenium 刮掉这条线?
- python - 使用请求 Python 抓取网页
- java - 如何从java代码以编程方式添加按钮等组件,而不是从XML添加它?
- symfony - 在 Symfony API 中显示上传到公共目录之外的图像
- powershell - 如何从 `git svn clone --authors-prog` 调用 PowerShell 脚本?
- php - PHP 启动:无法加载动态库 'pgsql.so'
- php - 流明:使用助手获取错误:不在对象上下文中时使用 $this
- c++ - 如何调用类成员的构造函数?
- javascript - 如何根据给定的索引更新嵌套数组中的值并在javascript中返回原始数组?
- swift - 无法确定与“GROUP_ACTIVITIES”关联的能力