【问题标题】:Best way to handle universal app state of view处理通用应用程序视图状态的最佳方法
【发布时间】:2023-04-05 04:29:02
【问题描述】:

在每种状态下捕捉状态变化和修改应用行为的最佳方法是什么?我整个上午都在寻找好的教程或建议,我刚刚找到 nice tutorial 用于 VisualStateManager 的使用。这对我来说真的很有帮助,但 VisualStudio 说,这种方法已经过时了。这种方式也不适用于某些功能,那么如何在 Windows 8.1 通用应用程序中为四种状态(横向、填充、捕捉、纵向)中的每一种高效且有效地修改 UI?

【问题讨论】:

    标签: c# wpf xaml windows-8.1 win-universal-app


    【解决方案1】:

    Windows 8.1 中没有 ApplicationViewState 枚举。 但是方法是一样的:在 SizeChanged 事件处理程序中使用视觉状态和 VisualStateManager。

    阅读这篇博文:http://marcominerva.wordpress.com/2013/10/16/handling-visualstate-in-windows-8-1-store-apps/

    它描述了如何在 windows 8.1 中确定当前的视觉状态

    【讨论】:

      【解决方案2】:

      在 Windows 8 中,页面有 4 种预定义的视图状态,Snapped、Filled、FullScreenLandscape 和 FullScreenPortrait。要知道视图状态,您必须使用返回 4 种状态之一的 ApplicationView.Value,然后您必须调用 VisualStateManager.GotoState (),并将状态名称作为参数传递。

      现在在 Windows 8.1 中没有预定义的视图状态,并且 ApplicationView 的 value 属性已被弃用。现在窗口大小更加灵活,用户可以在多应用模式下调整应用程序占用空间的宽度,因此窗口设计的决定必须根据容纳应用程序的窗口大小来决定。 当触发 SizeChanged 事件时,应使用 ApplicationView.GetForCurrentView 调用当前窗口信息,该函数返回一个 ApplicacionView,我们可以使用 Orientation、IsFullScreen、AdjacentToLeftDisplayEdge、AdjacentToRightDisplayEdge 等属性来做出决定,也需要确定窗口的大小。

      要找到屏幕的宽度有两种方法。

      我们可以访问WindowSize事件的WindowSizeChangedEventArgs类型的参数,然后调用e.Size.Width。

      我们也可以使用 Window.Current.Bounds 来找出窗口的大小。

      我们还必须在 OnNavigatedTo 方法页面中更新窗口的设计,因为当您按下按钮返回时不会触发 SizeChanged 事件,并且如果当前分辨率与上一个页面加载时的分辨率不同,那么就没有合适的 VisualState 了。

      我留下一个可能的解决方案的例子

      public class MainPage:Page
      {
          public MainPage()
          {
              this.Loaded += page_Loaded;
              this.Unloaded += page_Unloaded;
          }
      
          private void page_Loaded(object sender, RoutedEventArgs e)
          {
              Window.Current.SizeChanged += Window_SizeChanged;
          }
      
          private void page_Unloaded(object sender, RoutedEventArgs e)
          {
              Window.Current.SizeChanged -= Window_SizeChanged;
          }
      
          protected override void OnNavigatedTo(NavigationEventArgs e)
          {
              UpdateVisualState();
          }
      
          private void Window_SizeChanged(object sender, WindowSizeChangedEventArgs e)
          {
              UpdateVisualState();
      
          }
      
          private void UpdateVisualState()
          {
              var visualState = string.Empty;
              var applicationView = ApplicationView.GetForCurrentView();
      
              if (applicationView.IsFullScreen)
              {
                  if (applicationView.Orientation == ApplicationViewOrientation.Landscape)
                      visualState = "FullScreenLandscape";
                  else
                      visualState = "FullScreenPortrait";
              }
              else
              {
                  var size = Window.Current.Bounds;
      
                  if (size.Width == 320)
                      visualState = "Snapped";
                  else if (size.Width <= 500)
                      visualState = "Narrow";
                  else
                      visualState = "Filled";
              }
      
              VisualStateManager.GoToState(this, visualState, true);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多