检查usercontrol是否在Window Bounds中

时间:2013-04-04 09:26:58

标签: c# windows-8 windows-runtime windows-store-apps winrt-xaml

我有一个项目需要能够在屏幕上拖动用户控件(在网格中托管)。这适用于以下代码:

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>

1 个答案:

答案 0 :(得分:3)

您可以查看WinRT XAML工具包中的FlickBehavior,了解如何使用父CanvasCanvas.Top/Left属性而不是RenderTransform来实现该功能,假设{ {1}}定义你的界限。

这是一个摘要:

Canvas