我正在尝试创建一个简单的应用程序,允许用户使用TranslateTransform
事件处理程序在Image
控件内移动ManipulationDelta
的图像。
然而,执行翻译操作,图像以奇怪的方式被剪裁。事实上,它似乎是整个视口被翻译而不是视口内的图像。
我在这个非常简单的应用程序中重现了这种行为:
代码很简单,看起来像这样:
<Image
x:Name="Image"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Stretch="None"
ManipulationMode="TranslateX, TranslateY"
ManipulationStarted="Image_ManipulationStarted"
ManipulationCompleted="Image_ManipulationCompleted"
ManipulationDelta="Image_ManipulationDelta"
Source="/Assets/image.png"
>
<Image.RenderTransform>
<TranslateTransform x:Name="Translation" />
</Image.RenderTransform>
</Image>
这是背后的代码:
private void Image_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
Translation.X += e.Delta.Translation.X;
Translation.Y += e.Delta.Translation.Y;
}
此应用程序显示矩形600x600纯红色图像。我已经调整了应用程序的大小,使图像比可用的客户区域大。当用户稍微向左上方移动图像时,这就是应用程序的样子:
正如我所解释的那样,似乎已经翻译了整个视口。
如果我虚拟地将图像添加到上面的屏幕截图中,这就是我所期望的:
在上面的屏幕截图中,可以看到图像比应用程序更高,因此客户区的整个高度应该覆盖图像的红色部分。喜欢,因为图像已经向左移动,只有右侧屏幕的一小部分应该是白色的。
我希望这些屏幕截图有助于理解我的解释。
请使用ManipulationMode
时是否可以获得所需的行为?
答案 0 :(得分:0)
请使用ManipulationModes时是否可以获得所需的行为?
我认为答案是否定的,在UWP应用中无法做到这一点,您需要创建一个桌面应用来获得所需的行为。
在UWP应用中,Page
位于Frame
,然后控件或形状位于Page
中,因此基本上控件或形状都在{{1}中}} 容器。你想要做的是从容器中取出Frame
,在这种情况下,我们需要在UWP应用程序中为此Rectangle
提供另一个容器。
所以我能想到的就是创建一个新窗口来保存Rectangle
。但是这个新窗口会出现问题,应用程序的标题是一个新窗口,除非此窗口处于全屏模式。显然,全屏模式窗口无法解决问题。
此功能可以使用Win32 API完成,您可以参考C# Drag-and-Drop: Show the dragged item while dragging,但UWP应用程序不支持此API。它们仅适用于桌面应用。例如,您可以参考CreateIconIndirect function。此外,我找不到任何支持相同功能的UWP应用程序的API。