Windows Phone 8 APP 移植到Windows Phone 8.1 常见问题总结

前言(一些废话哈,可以略过)

    wp8.1的SDK相对8.0的还是变化不少的,类改变了很多,我就是我遇到的一些问题总结下,大家有用到的可以少走些弯路,一些东西国内都搜不到

(做这个人少,资料少,开始移植到wp8.1的也少些),建议小伙伴们google,或者关键字用英文搜索比较好,其实我大多都在stackoverflow找到的,

看官方文档也可以,但是就比较慢了。

正文

      MessageBox被MessageDialog取代了具体用法如下(有些变量名是随手写的,没经过思考。。。大家可以改下)

        public async static void ShowCustomDialog(string title, string mes, string ok, Action ok_callback, string cancel, Action cancel_callback)
        {

            MessageDialog c = new MessageDialog(mes,title);
            UICommand ok_cmd = new UICommand(ok);
            ok_cmd.Invoked += (dd) =>
            {
                if (ok_callback != null)
                {
                    ok_callback.Invoke();
                }
            };

            UICommand canle_cmd = new UICommand(cancel);
            ok_cmd.Invoked += (dd) =>
            {
                if (cancel_callback != null)
                {
                    cancel_callback.Invoke();
                };
            };
    
            c.Commands.Add(ok_cmd);
            c.Commands.Add(canle_cmd);
            IUICommand result = await c.ShowAsync();
     
        }

  获取设备基本信息的类DeviceStatus被EasClientDeviceInformation取代基本用法如下

       public static string GetDeviceInfo()
        {
            Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation deviceInfo = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation();
            var firmwareVersion = deviceInfo.SystemFirmwareVersion;

            string d = "{\"devicename\":\"" + deviceInfo.SystemProductName + "\",\"deviceManufacturer\":\"" + deviceInfo.SystemManufacturer + "\"}";
            return d;

        }

  获取设备唯一ID的类DeviceExtendedProperties.TryGetValue("DeviceUniqueId", out uniqueId))被HardwareIdentification取代,具体使用如下

        public static string GetDeviceUniqueID()
        {

            HardwareToken token = HardwareIdentification.GetPackageSpecificToken(null);
            IBuffer hardwareId = token.Id;

            HashAlgorithmProvider hasher = HashAlgorithmProvider.OpenAlgorithm("MD5");
            IBuffer hashed = hasher.HashData(hardwareId);

            string hashedString = CryptographicBuffer.EncodeToHexString(hashed);
            return hashedString;

        }

  在后台进程中执行UI进程任务时候用到的Deployment.Current.Dispatcher.BeginInvoke 被CoreWindow.GetForCurrentThread().Dispatcher取代,具体用法

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

   await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
   { // UI code goes here

   });

//or 
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
  CoreDispatcherPriority.Normal,
  ()=>{
      // UI code goes here
});

  当前线程睡眠的Thread.Sleep()被 await Task.Delay(1000)取代

     IsolatedStorageSettings被ApplicationData.Current.RoamingSettings取代,IsolatedStorageFile被ApplicationData.Current.LocalFolder;取代,具体使用如下

 

  public class IsolatedStorageHelper
    {
      private static ApplicationDataContainer _appSettings= ApplicationData.Current.RoamingSettings;

        public static T LoadSetttingFromStorage<T>(string Key, T defaultValue)
        {
            T ObjToLoad = default(T);

            if (_appSettings.Values.Keys.Contains(Key))
            {
                ObjToLoad = (T)_appSettings.Values[Key];
            }
            else
            {
                ObjToLoad = defaultValue;
            }
            return ObjToLoad;
        }

        public static void SaveSettingToStorage(string Key, object Setting)
        {
            if (!_appSettings.Values.Keys.Contains(Key))
            {
                _appSettings.Values.Add(Key, Setting);
            }
            else
            {
                _appSettings.Values[Key] = Setting;
            }

     
        }

        public static bool IsSettingPersisted(string Key)
        {
            return _appSettings.Values.Keys.Contains(Key);
        }
        public static bool DeleteSettingPersisted(string Key)
        {
            while (_appSettings.Values.Keys.Contains(Key))
            {
                 _appSettings.Values.Remove(Key);
                
            }
            
            return false;
        }
        public static async Task<bool> AppendStrToFolder(string str)
        {
            str = "时间:" + DateTime.Now.ToString() + str;
            // 获取应用程序数据存储文件夹
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
            // 在指定的应用程序数据存储文件夹内创建指定的文件
            StorageFile storageFile = await applicationFolder.CreateFileAsync("LuaPostJsonStr.txt", CreationCollisionOption.OpenIfExists);
            // 将指定的文本内容写入到指定的文件
            using (Stream stream = await storageFile.OpenStreamForWriteAsync())
            {
                byte[] content = Encoding.UTF8.GetBytes(str);
                await stream.WriteAsync(content, 0, content.Length);
            }
            return true;
        }
        public static async Task<bool> WriteFile(string filename,string content)
        {
            content = "时间:" + DateTime.Now.ToString() + "--------" + content;
                 IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
                 IStorageFile storageFile = await applicationFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
            try
            {
                using (Stream transaction = await storageFile.OpenStreamForWriteAsync())
                {
                    byte[] contents = Encoding.UTF8.GetBytes(content);
                    //设置如何打开流的位置有内容就设置流的位置到结束位置
                    if (transaction.CanSeek)
                    {
                        transaction.Seek(transaction.Length, SeekOrigin.Begin);
                    }
                    await transaction.WriteAsync(contents,0, contents.Length);
                    return true;
                }
            }
            catch (Exception exce)
            {
                return false;
                // OutputTextBlock.Text = "异常:" + exce.Message;
            }
        }
        public static async Task SavePic(UIElement root, string filename)
        {

            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync(root);
            var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();

            string path = "picSdk";
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFolder store = await storageFolder.CreateFolderAsync(path, CreationCollisionOption.OpenIfExists);    
            string ss = Path.Combine(path, filename);
            StorageFile file = await store.CreateFileAsync(ss);


            using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);

                encoder.SetPixelData(
                    BitmapPixelFormat.Bgra8,
                    BitmapAlphaMode.Ignore,
                    (uint)renderTargetBitmap.PixelWidth,
                    (uint)renderTargetBitmap.PixelHeight,
                    DisplayInformation.GetForCurrentView().LogicalDpi,
                    DisplayInformation.GetForCurrentView().LogicalDpi,
                    pixelBuffer.ToArray());

                await encoder.FlushAsync();
            }
    
        }


        public static async Task<bool> SaveFile(StorageFile filee)
        {

            string path = "picSdk";
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFolder store = await storageFolder.CreateFolderAsync(path, CreationCollisionOption.OpenIfExists);
            string ss = Path.Combine(path, filee.Name);
            StorageFile file = await store.CreateFileAsync(ss);
            await filee.MoveAndReplaceAsync(file);
            return true;
           

        }
        public static async Task< BitmapImage> LoadPic(string folderName,string fileName)
        {

            BitmapImage source = new BitmapImage();
            // Reopen and load the PNG file.
            if (await IsExistFolder(folderName))
            {
                var folder = ApplicationData.Current.LocalFolder;
                if (await IsExistFile(fileName,folderName))
                {
                    StorageFile file = await folder.GetFileAsync(fileName);
                    using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                    {                    
                        var encoder = await BitmapDecoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);
                        var stream = await encoder.GetPreviewAsync();
                        source.SetSource(stream);
                        source.CreateOptions = BitmapCreateOptions.None;
                    }
                }          
                 return source;
            }
            else
            {
                return null;
            }
        }
        public static async Task<bool> IsExistFile(string fileName)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            try
            {
                StorageFile file = await storageFolder.GetFileAsync(fileName);
                return true;
            }
            catch (FileNotFoundException e)
            {

                return false;
            }
            catch (Exception e)
            {
                return false;
            }

        }

        public static async Task<bool> IsExistFile(string fileName,string folderName)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFolder folder= await storageFolder.GetFolderAsync(folderName);
            try
            {
                StorageFile file = await folder.GetFileAsync(fileName);
                return true;
            }
            catch (FileNotFoundException e)
            {

                return false;
            }
            catch (Exception e)
            {
                return false;
            }

        }
        public static async Task<bool> IsExistFolder(string folderName)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            try
            {
                StorageFolder file = await storageFolder.GetFolderAsync(folderName);
                return true;
            }
            catch (FileNotFoundException e)
            {

                return false;
            }
            catch (Exception e)
            {
                return false;
            }

        }

        public static async Task< Stream> LoadPicByStream(string filename)
        {
            var store = ApplicationData.Current.LocalFolder;
            if ( await IsExistFile(filename))
            {
                StorageFile file= await store.GetFileAsync(filename);
               // fileStream.Close();
                return (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream();
            }
            else
            {
                return null;
            }

        }
    }

  最后这个类,东西比较多哈,有的还没来得及测试,那个小伙伴遇到问题也请告诉我下。耽误大家时间了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。