VS打包提示 清单引用了不属于负载的一部分的文件 Jan 8, 2020 由于给App做动态磁贴,需要引用运行时组件。在制作完毕后,准备打包上传商店,但是就在打包编译的时候,出现了一个奇怪的问题,VS总是打包失败,提示:清单引用了不属于负载的一部分的文件"xx.dll”。点击错误又没跳转到有错误的地方。真是奇怪了。搞了好久终于弄明白 解决办法如下: 用记事本打开项目文件夹,找到后缀为:csproj的文件,并打开。在其中找到ItemGroup的地方,依次在下面添加如下一组。其中的xx代表你项目文件错误的名字。保存就可以了。
uwp开发:创建磁贴到桌面 Jan 7, 2020 今天说下uwp用代码创建磁贴到桌面的方法。 对于uwp应用来说,磁贴是一大特色,所以,可以在打开应用的时候,提示用户,是否固定磁贴到桌面。 这样可以利于让你的app有更多的展示机会。 下面是具体做法: private async void CreatTile() { //磁贴ID var tileid = "tile"; //磁贴展示名称 var displayName = "磁贴"; //点击磁贴传回的参数 var args = string.Format("Click @ {0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); //磁贴的路径 var logourl = new Uri("ms-appx:///Assets/test.jpg"); //磁贴的大小 var size = TileSize.Square150x150; //创建磁贴对象 var tile = new SecondaryTile(tileid, displayName, args, logourl, size); //让磁贴显示展示名 tile.VisualElements.ShowNameOnSquare150x150Logo = true; //创建磁贴,返回bool值 bool b= await tile.RequestCreateAsync(); if (b) { await new MessageDialog("创建成功").ShowAsync(); } } 这样在button的点击事件中执行这个方法,即可将磁贴创建到桌面。 以上每步都有说明,大家参照即可。其中args 是点击磁贴后传回到应用的参数。 可以自己根据实际需要设定。
uwp开发:MVVM模式和数据绑定结合使用实战示例 Jan 6, 2020 前几天,我处理的是集合数据绑定的问题,也就是说返回的是一个集合数据,用MVVM模式来说,让ViewModel层实现ObservableCollection接口,并且在ViewModel里将获取到的list数据集合采取遍历集合并添加进ObservableCollection集合里,这样,在View层的后台,只需实例化ViewModel,并绑定到界面上,这样就实现了集合绑定及更改通知。 今天要说的是MVVM模式中处理非集合数据对象的绑定,这样的话,当然是要让ViewModel 实现INotifyPropertyChanged接口了。 1、Model类如下: public class TCContent { public string Image { get; set; } public string Title { get; set; } public string Directors { get; set; } public string Casts { get; set; } public string Pubdate { get; set; } public string TrailerUrl { get; set; } public string ItemSummary { get; set; } } 2、在ViewModel中,该怎么写呢? 因为INotifyPropertyChanged接口,它通知的对象是属性。所以,怎样才能通知到Modle中的每个属性呢?总不能把Model类的所有属性都写一遍再通知吧?当然不是了,其实很简单,就是将Model作为ViewModel的一个属性。 为了代码简洁,重用方便,定义个ViewModelBase的类,让它来实现INotifyPropertyChanged接口,完成相关通知。最后让ViewModel继承它就可以了。 这个BaseModel类如下:注意,我这里写出了实现属性更改通知的两种方法,早期一般用的是第二种,也很容易理解,在ViewModel的属性的set方法里,调用该方法即可,括号内传入的是属性名。这种方法容易看懂,但是缺点也很明显,就是属性名容易写错。 而第一种方法是推荐使用的,这里用到了CallerMeberName这个特性,具体可以查msdn文档,就是说系统内部通过反射可以自动获取属性名,这样的话,我们在ViewModel类的属性的set方法里就不用再写属性名了,很方便。我这里用方法一示例。 ViewModleBase类: public class ViewModelBase : INotifyPropertyChanged ...
uwp开发:截取当前屏幕中需要的图像并保存 Jan 6, 2020 在uwp开发中,有时候需要获取当前屏幕中的图像信息,但是又不适合直接截图保存,因为截图会保存整个屏幕的图像,而且,还需要用户会截屏操作。总之不适合获取屏幕中需要的图像信息。注意题目中的“需要的”。 意思是什么呢?就是我们可以获取当前屏幕中任意一个UIElement中的图像。废话不多说,还是以实战场景为例,因为自己最近就遇到了这种情况。 在做《简影UWP》的“电影台词”模块的时候,显示如下: 需求是:是用户点击保存图片,将会把图片和文字一块保存下来,查看的时候,也是当前显示的这样。 首先贴上前台代码: 可以看到,图片上面显示的文字是和图片分开的。文字是覆盖在图片上的,如果直接下载图片,将不会有文字,所以这不是我需要的结果。最简单的方法还是上面说的,直接获取如图所示的子Grid里面的图像信息,这样,就相当于将子Grid部分截图。这正是我需要的结果。 下来正式行动: 用到的类:RenderTargetBitmap 类。 RenderTargetBitmap类可以实现将UI元素转化为位图 ,即将UI元素截图,生成一张图片。与截图不同的是,它可以定义UIElement,这里,我只需要截图的是图片和文字部分,即上面的字Grid里面的图像信息。 要实现截图并保存到应用内存储,就先要定义文件名: string desiredName =DateTime.Now.Ticks+”.jpg”; 再定义文件存储的位置,并创建文件。 StorageFolder applicationFolder = ApplicationData.Current.LocalFolder; StorageFolder folder=await applicationFolder.CreateFolderAsync(“Pic”, CreationCollisionOption.OpenIfExists); StorageFile saveFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.OpenIfExists); 接着实例化对象: RenderTargetBitmap bitmap = new RenderTargetBitmap(); 接下来,要指定获取哪个UIelement的图像信息,按照我上面需要的,就是子grid,给它取名PicGird.通过该方法即可指定要获取的位图 await bitmap.RenderAsync(PicGrid); 接着注意:调用RenderAsync方法的时候会初始化RenderTargetBitmap类的对象,但是RenderTargetBitmap类的对象本身并不能作为图片来进行存储,要生成图片文件需要获取到图片的二进制数据。如果你想要获取 DataTransferManager 操作(例如共享协定交换)的图像,或想要使用 Windows.Graphics.Imaging API 将效果应用到图像上或对图像进行转码,那么就需要用到像素数据。如果你想访问RenderTargetBitmap的Pixels数据,你需要在用RenderAsync这个方法将UIElement定义为 RenderTargetBitmap后,再调用RenderTargetBitmap的GetPixelsAsync方法来获得其Pixels数据。该方法返回的是一个IBuffer类型,里面存储的是二进制的位图数。这个IBuffer可以转换为一个Byte数组,数组里面的数据是以BGRA8格式存储的。所以需要获取像素信息: var pixelBuffer =await bitmap.GetPixelsAsync(); 并做如下转化: using(var fileStream=await saveFile.OpenAsync(FileAccessMode.ReadWrite)) { var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream); encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth, (uint) bitmap.PixelHeight, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, pixelBuffer.ToArray()); await encoder. ...
uwp开发:Slider控件和MediaElement绑定,实现拖动播放 Feb 8, 2019 昨天有人问Slider 控件怎么控制MediaElement的播放进度,现在简单介绍一下。 1、实现原理: Slider拖动时,Value值改变,MediaElement播放时,Position值改变。所以,只需将Slider的Value属性和MediaElement的Position属性进行绑定即可。 2、实现方法: Slider的Value属性是double类型的,而MediaElement的Position属性是Timespan类型的,要绑定这两种不同类型的的话,就要用到Converter了,即值转换器。关于值转换器,可以百度,或者看IT追梦圆我写的这篇文章:数据绑定——值转换器 的简单使用。 3、实现过程: 写一个值转换器类: class MusicConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { return ((TimeSpan)value).TotalSeconds; } public object ConvertBack(object value, Type targetType, object parameter, string language) { return TimeSpan.FromSeconds((double)value); } } 这里注意的是,我是在Slider的Value属性上绑定Position的,这样的话,这个Value就是TimeSpan类型的,我们将它转为double类型,所以直接返回它的TotalSeconds,即总秒数即可。 下来,回到View界面:实现如下绑定。 到这里,还没完,因为我们需要将Slider的Value值和MediaElement播放的总秒数对应起来,这样才能实现百分比进度。所以,需要获取媒体播放的总时长,要注意的是,播放时长需要在MediaElement的MediaOpened事件中获取,因为在这个事件触发之前,系统是获取不到播放时长的。在该事件中将Slider的Maximum和播放总时间对应起来即可。 private void me_MediaOpened(object sender, RoutedEventArgs e) { sld.Maximum = me.NaturalDuration.TimeSpan.TotalSeconds; } 这样绑定就完成了。拖动Slider,实现播放相应进度。
uwp开发:数据模板选择器 Jan 6, 2019 这两天,在做《简影uwp》的首页推荐版块时,用到了数据模板选择器,所以简单介绍一下。数据模板选择器。顾名思义,就是可以选择性的展示不同的数据模板。那么,什么时候用数据模板选择器?怎么用呢?往下看: 应用场景: 同样是以我目前正在做的《简影uwp》为例,在做首页推荐版块时,要展示的数据是不同的版块的,都放在了一个集合中,这样的话,如果直接将数据绑定到ListView或者GridView上显示的话,是不可取的。虽然这些数据在一个集合内,但是因为集合内每个种类都不一样,显示的方式,展示的数据都不同,那么针对这种情况,就需要用到数据模板选择器了。根据不同的种类,展示不同的模板。 实例演示: 第一步:要使用数据模板选择器,首页定义一个数据模板选择器类。让这个类继承自:DataTemplateSelector。再定义需要展示的所以模板类型。然后重写它的SelectTemplateCore方法即可。根据集合内的类型,返回不同的数据模板。代码如下; public sealed class CustomDataTemplateSelector : DataTemplateSelector { public DataTemplate CollectionTemplate { get; set; } public DataTemplate ThreadTemplate { get; set; } public DataTemplate MuscicTemplate { get; set; } public DataTemplate VideoTemplate { get; set; } public DataTemplate TcTemplate { get; set; } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { RecList list = item as RecList; if (list != null) { switch (list.type) { case "collection": return CollectionTemplate; case "threadmusic": return MuscicTemplate; case "threadvideo": return VideoTemplate; case "movielines": return TcTemplate; default: return ThreadTemplate; } } return null; } } 第二步: ...
uwp开发:webview模拟安卓浏览器 May 26, 2018 很多时候,uwp移动端的网页体验很不好,因为大部分网站都没用针对wp手机做UA适配,所以为了我们的网页体验好一点,可以用webview来模拟成安卓浏览器。 原理就是修改uwp webview的useragent ,把它改成安卓的。 在网上随便找个安卓的useragent,我找的是这个: “Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Mobile Safari/537.36” 然后直接调用写好的这个方法就可以了: private void LoadUri(String uri) { var httpRequestMessage = new Windows.Web.Http.HttpRequestMessage(Windows.Web.Http.HttpMethod.Get, new Uri(uri)); var userAgent = “Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Mobile Safari/537.36”; httpRequestMessage.Headers.Add(“User-Agent”, userAgent); webview.NavigateWithHttpRequestMessage(httpRequestMessage); }