2014-06-28 24 views
16

Tôi đang cố gắng viết lại một ứng dụng mà tôi đã viết cho iOS. Tôi sẽ viết một phiên bản android nhưng nghĩ rằng sẽ tốt hơn nếu làm cho cơ hội này sử dụng Xamarin.Forms. Làm một trang tại một thời điểm, bây giờ tôi đang mắc kẹt trên một trang mà tôi cần để có được chiều rộng và chiều cao của màn hình. Có ai biết tương đương với View.Frame.Width của iOS trong Xamarin.Forms không?Cách nhận/phát hiện kích thước màn hình trong Xamarin.Forms?

Trả lời

4

Không có hiện một cách từ Xamarin.Forms bản thân nhưng chúng tôi có nó thực hiện như giao diện tương thích PCL trong Xamarin. Forms.Labs mà bạn có thể lấy từ NuGet hoặc mã nguồn từ GitHub.

https://github.com/XForms/Xamarin-Forms-Labs

IDevice có thuộc tính IDisplay với thông tin; mật độ pixel, chiều rộng, chiều rộng cho X & Y và một vài phương pháp mở rộng để tính toán kích thước tính bằng inch.

trang mẫu để nhận thông tin từ các thiết bị:

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/ExtendedDeviceInfoPage.cs

 #region Display information 
     var display = device.Display; 
     var displayFrame = new Frame(); 
     if (display != null) 
     { 
      displayFrame.Content = new StackLayout() 
      { 
       Children = 
       { 
        new Label() { Text = display.ToString() }, 
        new Label() { Text = string.Format("Screen width is\t {0:0.0} inches.", display.ScreenWidthInches()) }, 
        new Label() { Text = string.Format("Screen height is\t {0:0.0} inches.", display.ScreenHeightInches()) }, 
        new Label() { Text = string.Format("Screen diagonal size is\t {0:0.0} inches.", display.ScreenSizeInches()) } 
          } 
         }; 
     } 
     else 
     { 
      displayFrame.Content = new Label() { TextColor = Color.Red, Text = "Device does not contain display information." }; 
     } 

     stack.Children.Add(displayFrame); 
     #endregion 

Tạo một inch-by-inch khung chính xác trên tất cả các nền tảng bất kể thuộc tính hiển thị:

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/AbsoluteLayoutWithDisplayInfoPage.cs

public class AbsoluteLayoutWithDisplayInfoPage : ContentPage 
{ 
    public AbsoluteLayoutWithDisplayInfoPage(IDisplay display) 
    { 
     this.Title = "Absolute Layout With Display Info"; 
     var abs = new AbsoluteLayout(); 
     var inchX = display.WidthRequestInInches(1); 
     var inchY = display.HeightRequestInInches(1); 
     var originX = display.WidthRequestInInches(display.ScreenWidthInches()/2); 
     var originY = display.HeightRequestInInches(display.ScreenHeightInches()/2); 

     abs.Children.Add(new Label() { Text = "1\"x\"1\" blue frame" }); 

     abs.Children.Add(new Frame() 
      { 
       BackgroundColor = Color.Navy, 
      }, 
      new Rectangle(originX - inchX/2, originY - inchY/2, inchX, inchY)); 

     abs.Children.Add(new Frame() 
      { 
       BackgroundColor = Color.White 
      }, 
      new Rectangle(originX - inchX/16, originY - inchY/16, inchX/8, inchY/8)); 

     this.Content = abs; 
    } 
} 

To ge t đến thông tin thiết bị hoặc đặt trình phân giải DI của bạn hoặc sử dụng vùng chứa tĩnh. Cả 3 nền tảng có một thiết bị singleton gọi với tài sản CurrentDevice tĩnh:

resolverContainer.Register<IDevice>(t => WindowsPhoneDevice.CurrentDevice) 
resolverContainer.Register<IDevice>(t => AppleDevice.CurrentDevice) 
resolverContainer.Register<IDevice>(t => AndroidDevice.CurrentDevice) 
+0

Cảm ơn @SKall, tôi không làm ứng dụng của tôi theo cách PCL - nhưng tôi chắc chắn sẽ xem xét và xem liệu tôi có thể nhận được một số ý tưởng hay không. Cảm ơn bạn! – dmc

+0

Mã khóa học hoạt động cho dù sử dụng mã chia sẻ hoặc PCL. Trên mã chia sẻ bạn không cần DI, chỉ cần sử dụng cờ trình biên dịch để có được thiết bị hiện tại. – SKall

+0

Cảm ơn bạn @SKall, sẽ thử điều này vào buổi sáng. – dmc

1

Công thức

Tạo ứng dụng Xamarin.Android mới có tên ScreenSize. Sửa Main.axml để nó chứa hai TextView:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView 
     android:text="Screen Width:" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/screenWidthDp" /> 
    <TextView 
     android:text="Screen Height:" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/screenHeightDp" /> 
</LinearLayout> 
  1. Sửa Activity1.cs, thay đổi mã trong OnCreate như sau:

    [nhập mô tả hình ảnh ở đây] [1] riêng int ConvertPixelsToDp (float pixelValue) { var dp = (int) ((pixelValue) /Resources.DisplayMetrics.Density); trả lại dp; }

  2. Chạy ứng dụng. Tùy thuộc vào thiết bị, nó sẽ hiển thị chiều cao và chiều rộng màn hình. Ảnh chụp màn hình sau đây là từ một Galaxy Nexus:

[image link] http://i.stack.imgur.com/TQhba.png

+1

tôi đang tìm kiếm "Xamarin.Forms" cách cho điều này, nhưng nhờ. – dmc

30

Có một cách dễ dàng để có được chiều rộng và chiều cao của màn hình trong Xamarin.Forms và truy cập nó trên toàn cầu từ khắp mọi nơi trong ứng dụng của bạn. Tôi muốn làm điều gì đó như thế này:

1. Tạo hai thành viên nào trong App.cs của bạn:

public static class App 
{ 
    public static int ScreenWidth; 
    public static int ScreenHeight; 
    ... 
} 

2.Đặt các giá trị trong bạnMainActivity.cs(Android) hoặc bạnAppDelegate.cs(iOS):

Android:

protected override void OnCreate(Bundle bundle) 
{ 
    ... 

    App.ScreenWidth = (int)Resources.DisplayMetrics.WidthPixels; // real pixels 
    App.ScreenHeight = (int)Resources.DisplayMetrics.HeightPixels; // real pixels 

    // App.ScreenWidth = (int)(Resources.DisplayMetrics.WidthPixels/Resources.DisplayMetrics.Density); // device independent pixels 
    // App.ScreenHeight = (int)(Resources.DisplayMetrics.HeightPixels/Resources.DisplayMetrics.Density); // device independent pixels 

    ... 
} 

iOS:

public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
{ 
    ... 

    App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width; 
    App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height; 

    ... 
} 
+0

App.cs không tĩnh – Julien

+0

@Julien Trước Xamarin.Forms phiên bản 1.3.x. Một cách chính xác hơn được mô tả trong sách của chúng tôi trên http://xforms-kickstarter.com/ dưới ** Tham khảo kích thước màn hình **. – kaolick

+0

Trên Android, tôi đề xuất sử dụng: var pixel = Resources.DisplayMetrics.WidthPixels; // dip pixels var scale = Resources.DisplayMetrics.Density; int dps = (int) ((pixel - 0.5f)/tỷ lệ); App.ScreenWidth = dps; pixel = Resources.DisplayMetrics.HeightPixels; // dip pixels dps = (int) ((pixel - 0.5f)/tỷ lệ); App.ScreenHeight = dps; // dip pixels – Maury

0

Trong tập tin ứng dụng của bạn định nghĩa một công biến tĩnh

public static Size ScreenSize; 

Bạn nên khởi tạo biến cả trong IOS và Android trước khi gọi Trình xây dựng ứng dụng. Cho IOS, trong phương pháp FinishedLaunching

App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height); 

và cho Android, trong chức năng OnCreate

  App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels/Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels/Resources.DisplayMetrics.Density)); 
5

Nếu bạn đang sử dụng Xamarin hình thức, sau đó bạn có thể tìm thấy chiều cao chiều rộng và màn hình hiện tại trong thư viện lớp cầm tay (PCL) như dưới đây.

Đối với Width bạn sử dụng này trong PCL,

Application.Current.MainPage.Width 

Đối với chiều cao bạn có thể làm điều này trong PCL,

Application.Current.MainPage.Height 
+0

Tôi nhận được ngoại lệ thời gian chạy "Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng". –

+1

điều này cung cấp cho bạn chiều rộng và chiều cao bạn xác định. không phải kích thước thiết bị màn hình thực tế. bạn có thể thêm vào xaml width = 5000 và nó sẽ trả lại cho bạn 5000. bạn phải đi nguyên bản để có kích thước màn hình thực tế. – batmaci

Các vấn đề liên quan