• 12、uwp 开发的零碎总结


    1、在给  win10 uwp 打包时,第4修正版本号Major.Minor.Build.Revision)不能修改。

    在用 vs 打商店包时,修正版本号默认为 0,并且编辑框不能编辑,我在工程的清单文件中把它改为 1后,

    商店上传失败,描述信息为:Apps are not allowed to have a Version with a revision number other
    than zero specified in the app manifest 。
     
     
     
      蛋疼,因为服务器支持的缘故,前三位版本号是有其它用途的。
     
      咨询了一下大牛才知道,这个版本号是商店预留用的,app 自己不能修改。
    害的我浪费几个小时找解决方案。
     
     
    Note  The last (fourth) section of the version number is reserved for Store use and must be left as 0.

    2、在 win10 上,x:Bind 没有 ElementName属性, 可以使用 Path 指定元素的名称, 因为当前的

    xaml 的 DataContext 默认为 codebehind 页面:

    3、在 wp8.1 store 时,在页面切换时拦截手机上的 back 按钮,需要注册到手机的 Hardware 键上,如:

       虽然这种方式仍然在 win10 Mobile 上支持,不过在其他 win10 设备上不支持。可以使用全局 back 键,如 win10窗口左上角:

    在 win10 的 UWP 中, 键盘上的 Backspace (或者配合 alter | 空格) 为 后退键:

    .

    4、关于分辨率适配的理解。因为设计的同事肯定不如 uwp开发者对于 win10中对于缩放机制了解更多。最开始

    让设计的同事设计 UI 时,大概总结了一下:

      设计师的同学, 可以不用考虑屏幕的物理分辨率,只要考虑视图分辨率就行了(在做响应式布局的时候 ,基本只需要考虑屏幕的

    宽度,忽略屏幕的高度)。比如上面的两个 phone 的参数,都是 1080p的,那么 phone 上的 app 在运行时,则使用的是视图

    分辨率 (物理分辨率 / 缩放比, 比如 上面 1080/2.5 = 432px 宽, 1080/3 = 360px 宽),对于图片资源,只需要给我们最

    高清的就好了 (比如针对360px 视图宽度的一个背景,则需要是 1080px 宽的图片,这样在高清屏上才会显示得清晰度很高。具

    体针对这个清晰度图片的压缩,就交给我们写代码的同学就好了,编码的同学,根据 runtime 的缩放系统,再提供不同尺寸的资源,

    比如同一张图片: logo.scale-300.png 和 logo.scale-250.png,当app 从商店下载时,win商店会根据用户的设备,下载需要的

    图片。这些是runtime 的缩放系统关心的事情。)

      一般情况下 win10 设备屏幕的缩放比 : phone > 平板 > 桌面。phone 大约为  200% - 500%,  PC、pad 大约为 90%-250% 。

      

      意思就是,win 10 上针对 app 的响应式布局大概为 3段, “320px ~ 450 px” 为 phone 的,  “451px ~ 1024px” 为 pad 的,

    “1024px -> 正无穷 ” 为 pc 的   (或者 PC 的就 1920px 以上的。因为目前还没有较为通用的标准,后面可以再微调)。而真正给我们

    的图片资源,只需要最高分辨率的就好了,编码的同学会再根据需要生成不同尺寸的图片资源。

    5、在创建多窗口视图时,在 win10 uwp上,与 win8.1 不同,需要调用 Window.Activate() 方法

    ,窗口才会显示:

          ApplicationView MainAppView;       
            async void Show_Multi_View(_A _a)
            {
                MainAppView = ApplicationView.GetForCurrentView();
                var MainDispatcher = Window.Current.Dispatcher;
              
           if (_a == null) return;
    CoreApplicationView view
    = CoreApplication.CreateNewView(); await view.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { var f = new Windows.UI.Xaml.Controls.Frame();
    f.Navigate(typeof(PlayPage)); Window.Current.Content = f; // 主题 f.RequestedTheme = ElementTheme.Light; Window.Current.Closed += (sender, e) => { Debug.WriteLine("Window.Current.Closed"); }; ApplicationView appView = ApplicationView.GetForCurrentView(); appView.Title = "独立窗口视频"; // += AppView_Consolidated; appView.Consolidated += (sender, e) => { if (f.CanGoBack) f.GoBack(); Window.Current.Close(); }; //view.CoreWindow.Closed += CoreWindow_Closed; //view.CoreWindow.Activated += CoreWindow_Activated; // view.CoreWindow.KeyDown += CoreWindow_KeyDown; view.CoreWindow.VisibilityChanged += (sender, e) => { Debug.WriteLine("CoreWindow_VisibilityChanged"); }; //Window.Current.Activate(); // ApplicationViewSwitcher.SwitchAsync(appView.Id, MainViewId, ApplicationViewSwitchingOptions.Default); await MainDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { // 必须在主线程中调用,否则引发 灾难错误 bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(appView.Id, ViewSizePreference.UseHalf); }); }); }

     

    6、在 Frame 对象中,切换页面时,配置导航动画:

    参考 SlideNavigationTransitionInfo :

    https://msdn.microsoft.com/en-us/library/windows.ui.xaml.media.animation.slidenavigationtransitioninfo.aspx

    7、获得操作系统版本号:

    /// <summary>
    /// 获取操作系统版本
    /// </summary>
    /// <returns>操作系统版本</returns>
    private static string GetOsVersion()
    {
        ulong version = Convert.ToUInt64(AnalyticsInfo.VersionInfo.DeviceFamilyVersion);
        return $"{version >> 48 & 0xFFFF}.{version >> 32 & 0xFFFF}.{version >> 16 & 0xFFFF}.{version & 0xFFFF}";
    }


    8、在做列表控件的分组操作时,当GridView (ListView) 的 ItemsPanel 为默认的ItemsWrapGrid  (ItemsStackPanel) 时,

    GridView.GroupStyle.Panel 不起作用; 当 ItemsPanel 为其它容器时(StackPanel)则GridView.GroupStyle.Panel 起

    作用(其为 VisualTree):

     

      

    9、如果在使用 Binding 和 x:Bind 进行数据绑定时,如果在运行时引发了异常(比如绑定到 a.name,但 a 为 null,就会

    抛 ArgumentNullException ),虽然 app不会 crash,但会造成性能下降明显,特别是绑定的 item 有很多时。

    在 vs 的 output 窗口,可以看到有哪些属性在绑定时抛了异常:

    10、如果把 ListView 的 ItemsPanelTemplate 改为 StackPanel,则设置ListView.GroupStyle 中的

    HeaderContainerStyle 样式不起作用。并且 Group.Header 不会滑动停留:

    10、使用 BitmapIcon 控件可以设置图片的前景色

    例如,下面的搜索 icon 本身为白色,但可以改变为其它颜色:

    <BitmapIcon x:Name="searchIcon" Foreground="Yellow"  UriSource="ms-appx:///Assets/Icons/search.png">

    11、现在你的 UWP 下载的目标设备,可以通过商店后台,或者在 app 清单文件中进行指定:

    MSDN :  https://msdn.microsoft.com/zh-cn/library/windows/apps/mt148548.aspx#device

     

    在清单文件中:

    这里通过  Windows.Universal、Windows.Mobile、Windows.Destop 三个选项,来设置下载的目标设备。

    在商店后台:

    在商店的允许下载设备的设置,和清单文件中的设置,两个是无关的,不会通过 vs 关联账户会进行同步。

    12、在 visual studio 2015 的 xaml 编辑器中,增加了一个比较赞的功能,就是像 C# 中那样,可以通过 # region 和 #endregion

    进行代码块的折叠 :

    13、遇到一个奇怪的 bug,在 phone端,如果在 app 的资源字典里声明:

     <!-- 覆盖 phone 上 的系统样式 PhoneAccentBrush ,pad 上没有-->
     <SolidColorBrush x:Key="PhoneAccentBrush" Color="Red"/>

     

    会在某些 phone上(比如 lumia920、lumia 620)上 app页面顶部出现一根红线。 

     例如:

     

    补充:如果在 UWP 中,设置:

    <SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="Red"/>

    会使 lumia620顶部和右下侧出现一根横线

    14、今天遇到一个诡异的问题,只在 lumia950 上复现了。开始时, app直接 crash,并没有详细的异常提示,然后根据 vs提示,打开捕获所有异常的设置:

    在中断面板中,勾选所有 CLR 异常,即在所有引发异常的地方中断代码的执行(即使在 try catch 中引发的异常):

    然后捕获了 try catch 中,读取响应报文流的代码,当注释掉该行代码时,app 不会 crash,如果此处 抛出了异常,即使是在 try 中

    执行的,依然会引发 app 的 crash:

  • 相关阅读:
    GridControl主从表设置
    Asp.net Ajax框架教程
    实现类似百度下拉框自动匹配功能
    将一个DataTable分解成多个DataTable
    找不到可安装的ISAM ,asp.net读取数据丢失,解决的一列里有字符与数字的
    StringCollection FAQ [C#, BCL]
    从枚举的初始化说起 [C#]
    当多态遇上数组 ... [C++] (Rewritten)
    我并不是不闻不问![C#]
    当多态遇上数组 ... [C++, C++/CLI, C#]
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/5044247.html
Copyright © 2020-2023  润新知