我有一个项目需要能够在屏幕上拖动用户控件(在网格中托管)。这适用于以下代码:
void MyUserControl_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
var ct = (CompositeTransform) RenderTransform ?? new CompositeTransform {CenterX = 0.5, CenterY = 0.5};
ct.TranslateX += e.Delta.Translation.X;
ct.TranslateY += e.Delta.Translation.Y;
}
问题是用户控件可以一直拖出屏幕区域。为了防止这种情况,我尝试了此处显示的示例:http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationdelta.aspx
不幸的是,它使用 containsRect.Contains(shapeBounds),而在Windows 8中,我们需要用Point替换shapeBounds(这是一个rect)。我不确定如何使用它。
所以问题是我们如何确保用户控件或任何UIElement不能被拖出Windows 8商店应用程序中的Window.Current.Bounds区域?
感谢。
编辑:有关xaml结构的更多详细信息:
主页包含一个水平和垂直对齐设置为拉伸的网格。根据需要将用户控件添加到此网格中。每个usercontrol都有一个包含3个不同视图(全屏,窗口和小视图)的父网格。视图根据用户的选择显示。只有在显示窗口网格时才能应用拖动行为。所以我们有这个
<Grid> <!-- this is the parent grid on mainpage with horizontal and vertical alignment to stretch-->
<Grid> <!-- this is the usercontrol's main grid (added to above grid via code). This grid must be draggable if the below grid is window -->
<Grid /> <!-- this is one of the child grids that is shown based on user's choice (fullscreen, window or small view).-->
</Grid>
</Grid>
我没有太多选择来改变布局。在usercontrol中使用上面的ManipulationDelta事件(根据显示的子网格启用/禁用),我可以获得拖动行为,但控件可以超出窗口范围。那么有什么方法可以通过代码而不是xaml在WinRTXamlToolkit中添加下面的FlickBehavior或者根据某些条件启用/禁用行为?
<i:Interaction.Behaviors>
<views:HeavyFlickBehavior />
</i:Interaction.Behaviors>
答案 0 :(得分:3)
您可以查看WinRT XAML工具包中的FlickBehavior
,了解如何使用父Canvas
和Canvas.Top/Left
属性而不是RenderTransform
来实现该功能,假设{ {1}}定义你的界限。
这是一个摘要:
Canvas