首页 > 解决方案 > UWP - 如何在拖放过程中更改拖动图像的大小?

问题描述

我正在尝试拖放存在于 Viewbox 中的 UI 元素。一旦拖动过程开始,预期的图像就会显示用于拖动操作,但图像是全尺寸的,而不是 Viewbox 中显示的图像大小。

有没有办法让拖动图像自动尊重源元素的显示大小?如果没有,有没有办法以编程方式更改拖动图像的大小以匹配被拖动的 UI 元素的显示大小?

我在 DragStartingEventArgs 的 DataPackage 或 DragUI 中看不到任何允许调整拖动图像大小的选项。

被拖动的 UI 元素是一个 RelativePanel,其中包含许多嵌入的图像和形状。

标签: uwpdrag-and-drop

解决方案


好的,所以这有点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();
    }

推荐阅读