Windows Phone 中横向模式下的坐标

Posted

技术标签:

【中文标题】Windows Phone 中横向模式下的坐标【英文标题】:Coordinates in landscape mode in Windows Phone 【发布时间】:2011-12-06 15:40:26 【问题描述】:

这是我在横向模式下的应用程序(以及网格内称为“LayoutRoot”的两个边框)。

1) 我正在尝试以这种方式接收border1 的坐标:

    GeneralTransform generalTransform = border1.TransformToVisual(LayoutRoot);
    Point point = generalTransform.Transform(new Point(0, 0));

它返回我预期的点坐标:X=0, Y=380

2) 现在我正在尝试通过这些坐标接收相同的border1

var controls = VisualTreeHelper.FindElementsInHostCoordinates(
                    point, LayoutRoot).ToArray();

突然间我收到了border2!似乎FindElementsInHostCoordinates 认为它处于纵向模式。如何在横向模式下正确接收坐标控制?

【问题讨论】:

+1 仅用于漂亮的示例布局... 图片 = 10^3 个字。 如何在设备或应用程序上设置方向? @KeeanoMartin:我的页面 xaml 中定义了 SupportedOrientations="Landscape" Orientation="Landscape" 你考虑过简单的转换吗? (portX = maxPortX - landY; portY = landX) 用于左侧,(portX = landY; portY = maxPortY - landX) 用于右侧。 【参考方案1】:

FindElementsInHostCoordinates 似乎没有考虑横向模式或 SystemTray 的存在。只有当您使用 SystemTray.IsVisible="False" 的肖像坐标时,它才真正起作用。

查看 Alan Mendelevich 的这篇博文了解更多详情:

http://devblog.ailon.org/devblog/post/2011/04/03/Obstruction-Detection-in-Silverlight-for-Windows-Phone.aspx

如果 SystemTray 尺寸可见,则需要执行与此类似的操作。

示例代码:

using System.Linq;
using System.Windows;
using System.Windows.Media;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace PhoneApp4

    public partial class MainPage : PhoneApplicationPage
    
        // Constructor
        public MainPage()
        
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        
            GeneralTransform generalTransform = border1.TransformToVisual(LayoutRoot);
            Point point = generalTransform.Transform(new Point(1, 1));
            var controls = FindElementsAtCoordinates(point);
        

        private UIElement[] FindElementsAtCoordinates(Point point)
        
            if ((this.Orientation & PageOrientation.Portrait) == 0)
            
                if (this.Orientation == PageOrientation.LandscapeLeft)
                    point = new Point(
                        this.ActualHeight - point.Y,
                        point.X + (SystemTray.IsVisible ? 72 : 0));
                else
                    point = new Point(
                        point.Y,
                        this.ActualWidth - point.X + (SystemTray.IsVisible ? 72 : 0));
            

            return VisualTreeHelper.FindElementsInHostCoordinates(
                new Point(point.X, point.Y + (SystemTray.IsVisible ? 72 : 0)),
                page).ToArray();
        
    

XAML:

<phone:PhoneApplicationPage
    x:Class="PhoneApp4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="StaticResource PhoneFontFamilyNormal"
    FontSize="StaticResource PhoneFontSizeNormal"
    Foreground="StaticResource PhoneForegroundBrush"
    SupportedOrientations="Landscape"
    Orientation="Landscape"
    mc:Ignorable="d"
    d:DesignHeight="480"
    d:DesignWidth="728"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid
        x:Name="LayoutRoot"
        Background="Transparent">
        <Border
            x:Name="border1"
            Width="100"
            Height="100"
            VerticalAlignment="Bottom"
            HorizontalAlignment="Left"
            BorderThickness="5"
            BorderBrush="Red" />
        <Border
            x:Name="border2"
            Width="100"
            Height="100"
            VerticalAlignment="Bottom"
            HorizontalAlignment="Center"
            BorderThickness="5"
            BorderBrush="Orange" />
    </Grid>

    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Minimized">
            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
                <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
            </shell:ApplicationBar.MenuItems>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>

【讨论】:

感谢您的回答。奇怪的行为。

以上是关于Windows Phone 中横向模式下的坐标的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Mobile-Phonegap:Windows 8 横向模式下的页脚对齐问题

横向模式下的 Cocos 2d & CGPoint 混淆

CreateJs Canvas 形状在 Windows Phone 上失去坐标

c# Windows Phone 8.1 如何获取地理坐标对象

windows phone 8 - 如何在地图上显示经度和纬度坐标(当前位置)

无法在横向模式下点击 (x,y) 坐标