2012-06-11 43 views
8

Cho phép nói rằng tôi có một lưới với 2 hàng, 2 cột và nhiều điều khiển bên trong mỗi ô.Làm thế nào để phát hiện các thay đổi định hướng và thay đổi bố cục?

Khi ứng dụng được thay đổi sang chế độ chụp, tôi có nghĩa là 1/3 màn hình tôi muốn ứng dụng là duy nhất, một cột, 2 hàng và chỉ hiển thị một số điều khiển tôi sẽ quyết định.

Tôi có loại kiểm soát nào đối với điều này?

thx

Trả lời

8

Bạn nên tận dụng các VisualStateManager trong XAML, kiếm một giải pháp XAML đầy đủ:

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="OrientationStates"> 
      <VisualState x:Name="Full"/> 
      <VisualState x:Name="Fill"/> 
      <VisualState x:Name="Portrait"/> 
      <VisualState x:Name="Snapped"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
</Grid> 

tạo ra storyboards cho mỗi VisualState và các yếu tố ẩn/hiển thị trong XAML của bạn. Ví dụ của Microsoft sử dụng cùng một giải pháp.

-

Cập nhật

Tôi tìm kiếm trên mạng và thấy các trạng thái thích hợp, một ví dụ là đằng sau liên kết này: MSDN.

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="ApplicationViewStates"> 
     <VisualState x:Name="FullScreenLandscape"/> 
     <VisualState x:Name="Filled"/> 
     <VisualState x:Name="FullScreenPortrait"/> 
     <VisualState x:Name="Snapped"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Các trạng thái phản ánh ApplicationViewState enum. Bạn có thể tìm thấy thêm thông tin here.

+0

bạn có thể xin hãy giải thích câu trả lời của bạn nhiều hơn ?, với sự giúp đỡ của bạn, tôi có thể nhận được liên kết này, http://www.markermetro.com/2011/11/technical/windows-8-metro-style-apps-layout-and-orientation-management-with- xaml /, vì vậy nó có nghĩa là tôi phải viết một bố trí khác nhau cho mỗi trạng thái trực quan, và rebind dữ liệu trên mỗi định hướng thay đổi để điều khiển chính xác tùy thuộc vào nhà nước? –

+0

Có!Đó thực sự sẽ là giải pháp tốt nhất, xaml duy nhất, afaik. Bạn có thể với một số kịch bản thông minh sử dụng lại một số yếu tố của bạn, nhưng bạn chủ yếu sẽ phải tạo bố trí khác nhau. Nếu bạn làm điều đó có thể là khôn ngoan để thay đổi chúng để tách UserControls hoặc Views và bao gồm những người. – Kolky

+0

Xin lỗi, tôi hơi có chút suy nghĩ. Microsoft đã tạo một lớp Trang cơ sở hỗ trợ các VisualState này. Tôi đã cập nhật bài đăng của mình bằng một ví dụ dễ sử dụng hơn ... – Kolky

8

Có giao diện trên DisplayProperties.OrientationChanged -Event. Khi nó cháy bạn có thể sửa đổi lưới của bạn và sắp xếp lại các điều khiển của bạn.

9

Sử dụng DisplayProperties.OrientationChanged sự kiện (theo đề nghị của @Jan K.) có thể không được chính xác những gì bạn đang tìm kiếm, xem xét các phần nhận xét sự kiện này:

Các DisplayProperties.OrientationChanged sự kiện xảy ra chỉ khi định hướng hiển thị hoặc thay đổi màn hình và không nhất thiết khi định hướng của ứng dụng thay đổi. Để xác định hướng của ứng dụng cho mục đích bố cục, hãy sử dụng thuộc tính ApplicationView.Value.

nhưng vì ApplicationView.Value lẽ sẽ bị bỏ rơi sau khi Windows 8.1 phát hành MS đề nghị sử dụng ApplicationView.GetForCurrentView() thay vì:

ApplicationView phương pháp tĩnh có thể thay đổi hoặc không có sẵn cho các phiên bản sau khi Windows 8.1 Xem trước. Thay vào đó, hãy sử dụng ApplicationView.GetForCurrentView() để có được một phiên bản của ApplicationView.

Vì vậy, bây giờ tôi đã kết thúc với mã (có một loại quan điểm năng động và không thể xem trước thiết kế tất cả mọi thứ trong XAML qua VisualStateManager, không may):

public MainPage() 
{ 
    InitializeComponent(); 
    Window.Current.SizeChanged += (sender, args) => 
    { 
     ApplicationView currentView = ApplicationView.GetForCurrentView(); 

     if (currentView.Orientation == ApplicationViewOrientation.Landscape) 
     { 
      // when args.Size.Width > args.Size.Height 
     } 
     else if (currentView.Orientation == ApplicationViewOrientation.Portrait) 
     { 
      // when args.Size.Width < args.Size.Height 
     } 
    }; 
} 
Các vấn đề liên quan