Silverlight 4, есть ли жизнь на десктопе


Published on

"Silverlight 4, есть ли жизнь на десктопе" - Евгений Жарков

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Silverlight 4, есть ли жизнь на десктопе

  1. 1. Silverlight 4, есть ли жизнь на десктопе?Евгений ЖарковSilverlight MVP/MCTS
  2. 2. Silverlight Windows ПК Phone 7 ВнеБраузер браузера
  3. 3. Out of browser (OOB)• Управление окном• Настройка внешнего вида окна• Размещения HTML внутри приложения• Окна уведомлений• Digital Rights Management (DRM)• Расширенные права• Доступ к файловой системе• COM• Интегрированная возможность обновления
  4. 4. Активация OOB
  5. 5. Конфигурация OOB
  6. 6. ИнсталляцияДовели до ума
  7. 7. Доступ к буферу обмена Прямой Кросс-доменные Elevated доступ к папке запросы trust User COM
  8. 8. Установка доверенных приложений
  9. 9. Подпись XAP
  10. 10. Тихая установка XAP Инсталляция/install:"xapFile" – where xapFile is the file name/file path to the .xap file., E.g./install:"c:tempsample.xap"/origin:"xapURI" – where xapURI is the URI where the .xap file wouldve come from if notinstalled at the commandline e.g. /origin:"" . This URI will be used as the site of origin for security purposes. For example, for sandboxed applications, Silverlight networking requires a policy file check when making network requests to domains other than the site of origin. The origin also serves as a unique ID for the application. The xapURI must be an absolute URI not a relative URI, and must start with http:, https:, or file:./overwrite -- (optional) Overwrites any previously installed .xap with that xapURI. Деинсталляция/uninstall – Uninstalls the application specified in /origin. This is the same /origin valuethat was used to install the app originally./origin:"xapURI" – same as /origin for the install case
  11. 11. Тихая установка XAP Установкаsllauncher.exe /install:"{LocalPathToXapFile}Yourfile.xap" /origin:"{urltoxapfile}/Yourfile.xap" /shortcut:desktop+startmenu Автозапуск"%ProgramFiles%Microsoft Silverlightsllauncher.exe" /emulate:"Yourfile.xap" /origin:"" Деинсталляция"%ProgramFiles%Microsoft Silverlightsllauncher.exe" /uninstall /origin:""
  12. 12. Тихая установка Silverlight/q - quiet install or upgrade. This installs or upgrades Silverlightwithout seeing the GUI. When Silverlight is installed quietly, by defaultprivacy related features such as DRM protected media playback andthe Silverlight auto-update feature will be configured to prompt theuser for permission on 1st use of the respective features. TheSilverlight auto-update feature requires administrative rights so non-admin users will not be prompted./doNotRequireDRMPrompt - turns off the 1st use prompt allowingcontent protected by Digital Rights Management (DRM) to playwithout requiring any end-user intervention. When Silverlight isinstalled quietly, DRM Playback is set to prompt on 1st use by default./ignorewarnings - non-fatal warnings will not be reflected in the quietinstaller return code but will instead return zero indicating success./noupdate - disables the Silverlight internal auto-updater./qu - quiet uninstall. This uninstalls Silverlight without seeing the GUI.
  13. 13. Тихая установка Silverlight Результирующая строкаSilverlight.exe /q /doNotRequireDRMPrompt
  14. 14. NSIS Script ExampleName “Test Out of Browser Installer"OutFile “TextOOBInstaller.exe"InstallDir "$PROGRAMFILESTestOOB"XPStyle onSection SetOutPath "$INSTDIR" SetOverwrite ifnewer File "Silverlight.exe" ExecWait "$INSTDIRSilverlight.exe /q /doNotRequireDRMPrompt" File “TestOOB.xap" ExecWait "$PROGRAMFILESMicrosoft Silverlightsllauncher.exe" /install:"$INSTDIRTestOOB.xap" /origin:"" /shortcut:desktop+startmenuSectionEnd
  15. 15. Batch Script:: Is this a 64-bit machine?@echo offif exist "%ProgramFiles(x86)%" (:: Were on 64-bit set sllauncherlocation="%ProgramFiles(x86)%MicrosoftSilverlightsllauncher.exe") else (::Were on 32-bit set sllauncherlocation="%ProgramFiles%MicrosoftSilverlightsllauncher.exe"):: run SL%sllauncherlocation% /overwrite /emulate:“TestOOB.xap"/origin:"http://blabla/TestOOB.xap"
  16. 16. Мои документы 我的文件 My Eigene Documents DateienMes docum ents Documents Мои Ταдокументы έγγραφά μου
  17. 17. Batch Script User FolderИзвлекаем правильный адрес директории “Мои документы” из реестраFOR /F "tokens=3 delims= " %%G IN (REG QUERY"HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders" /v "Personal") DO (SET docsdir=%%G)
  18. 18. Многоязычный интерфейс Добавление поддерживаемых культур в файл проекта<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="4.0" DefaultTargets="Build"xmlns=""> <PropertyGroup> <Configuration Condition=" $(Configuration) == ">Debug</Configuration> <Platform Condition=" $(Platform) == ">AnyCPU</Platform> <!– настройки --> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion> <SilverlightApplication>true</SilverlightApplication> <SupportedCultures>en-US,ru-RU,uk-UA</SupportedCultures> <XapOutputs>true</XapOutputs>
  19. 19. Многоязычный интерфейс Добавляем ресурсы с локализованным текстом
  20. 20. Многоязычный интерфейс Установить модификатор доступа в Public
  21. 21. Многоязычный интерфейс Регистрация ресурса<Application xmlns="" xmlns:x="" xmlns:local="clr-namespace:MyApplication" x:Class=“MyApplication.App"> <Application.Resources> <local:LocalizationResource x:Key="Localization" /> </Application.Resources></Application>
  22. 22. Многоязычный интерфейс Регистрация ресурсаpublic class LocalizationResource : INotifyPropertyChanged{ private static Localization.Strings resource = new Localization.Strings(); public Localization.Strings Strings { get { return resource; } set { OnPropertyChanged("Strings"); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion}
  23. 23. Многоязычный интерфейс Переключение языка UIThread.CurrentThread.CurrentUICulture = new CultureInfo("uk-UA");((LocalizationResource)Application.Current.Resources["Localization"]).Strings = new MyApplication.Localization.Strings();
  24. 24. COM Подключаем пространство именusing System.Runtime.InteropServices.Automation; Создаем файлы в любом месте на ПКusing (dynamic fsoCom =AutomationFactory.CreateObject("Scripting.FileSystemObject")){ dynamic file = fsoCom.CreateTextFile(@"c:test.txt", true); file.WriteLine("Bloody Hell!"); file.WriteLine("Silverlight is writing to C:"); file.Close();}
  25. 25. COM Пиним приложение на панель задачusing (dynamic ShellApplication =ComAutomationFactory.CreateObject("Shell.Application")){ dynamic commonPrograms = ShellApplication.NameSpace(23); string allUsersPath = commonPrograms.Self.Path; dynamic directory = ShellApplication.NameSpace(allUsersPath +@"Accessories"); dynamic link = directory.ParseName("Calculator.lnk"); dynamic verbs = link.Verbs(); for (int i = 0; i < verbs.Count(); i++) { dynamic verb = verbs.Item(i); if (verb.Name.Replace(@"&", string.Empty).ToLower() == "pinto taskbar") { verb.DoIt(); } }}
  26. 26. COM Добавляем OOB-приложение в автозагрузкуusing (dynamic ShellApplication =ComAutomationFactory.CreateObject("Shell.Application")){ dynamic commonPrograms = ShellApplication.NameSpace(11); string allUsersPath = commonPrograms.Self.Path; dynamic directory = ShellApplication.NameSpace(allUsersPath +@"Programs"); dynamic link =directory.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName +".lnk"); string OOBLink = link.Path; using (dynamic WShell =ComAutomationFactory.CreateObject("WScript.Shell")) { WShell.RegWrite(@"HKLMSoftwareMicrosoftWindowsCurrentVersionRun" +Deployment.Current.OutOfBrowserSettings.ShortName, OOBLink); MessageBox.Show("Please restart your machine and this application willload on startup."); }
  27. 27. COM Работа с ODBCusing (dynamic IDbConnection =ComAutomationFactory.CreateObject("ADODB.Connection"))using (dynamic IDbCommand =ComAutomationFactory.CreateObject("ADODB.Command")){ IDbConnection.ConnectionString = "driver={SQL Server};" + "server=.;uid=sa;pwd=password;database=Northwind"; IDbConnection.Open(); IDbCommand.ActiveConnection = IDbConnection; IDbCommand.CommandText = @"INSERT INTO [Northwind].[dbo].[Region] ([RegionID], [RegionDescription]) VALUES (10, BLa)"; IDbCommand.Execute();}
  28. 28. Тихая установка MSSQL Expresssqlexpr32.exe -q /norebootchk /qn REBOOT=ReallySuppress INSTANCENAME="name" ADDLOCAL=ALL SECURITYMODE=SQL SAPWD="password" SQLAUTOSTART=1 DISABLENETWORKPROTOCOLS=0 Compact Editionmsiexec /quit /i SSCERuntime-ENU-x86.msi
  29. 29. Silverlight COM Toolkit
  30. 30. Silverlight COM Toolkit CopyComToolkit.IO.File.Copy(@"c:AnyDirAnyFile.ext", @"c:AnyDirAnyFile2.ext", true); Existsbool exist = ComToolkit.IO.File.Exists(@"c:AnyDirAnyFile.ext"); WriteAllBytesstring[] contents = //some lines of text...ComToolkit.IO.File.WriteAllLines(@"c:AnyDirAnyFile.ext", bytes); Open AdoFileStream stream = ComToolkit.IO.File.Open(@"c:AnyDirAnyFile.ext", System.IO.FileMode.OpenOrCrea te, System.IO.FileAccess.ReadWrite);
  31. 31. Silverlight COM Toolkit ComToolkit.Datastring connectionString = @"Provider=SQLOLEDB;DataSource=servernamesqlexpress;Initial Catalog=databasename;User ID=username;Password=password";using (var connection = new ComToolkit.Data.AdoConnection(connectionString)) { connection.Open(); var command = connection.CreateCommand(); command.CommandText = "SELECT MyColumn FROM MyTable"; var reader = command.ExecuteReader(); while (reader.Read()) { object byindex = reader[0]; object bystring = reader["MyColumn"]; // для работы с динамическими свойства reader должен быть объявлен как dynamic //object bydynamic = reader.MyColumn;}}
  32. 32. Silverlight COM Toolkit Асинхронный ComToolkit.Dataprivate ComToolkit.Data.AdoConnection connection;private void ExecuteReaderAsyncSample() { connection = new ComToolkit.Data.AdoConnection(connectionString); connection.Open(); var command = connection.CreateCommand(); command.CommandText = "SELECT MyColumn FROM MyTable"; command.ExecuteReaderCompleted += newEventHandler<ComToolkit.Data.ExecuteReaderCompletedEventArgs>(command_ExecuteReaderCompleted); command.ExecuteReaderAsync(); }void command_ExecuteReaderCompleted(objectsender, ComToolkit.Data.ExecuteReaderCompletedEventArgs e) { //TODO: обрабатываем результат}
  33. 33. Работа с документами PDFXPS Desktop Microsoft Application Office HTML
  34. 34. XML Paper Specification (XPS) Позитивные факторы• В основе лежит ZIP, XML, XAML. Разработан Microsoft и Ecma International, 2006 год• Возможность относительно легкой конвертации в XAML• Родная поддержка в Windows Vista/7 Негативные факторы• Windows XP SP2 требует наличие .NET Framework 3 и XPS Document Viewer
  35. 35. PDF Позитивные факторы• Бесплатные компоненты для обработки PDF-документа• Возможность разместить документ в WebBrowser при наличии Adobe Acrobat плагина Негативные факторы• Платные компоненты для обработки и отображения в Silverlight-приложении
  36. 36. HTML Позитивные факторы• Возможно разместить внутри элемента управления WebBrowser Негативные факторы• Невозможно открывать локальные файлы внутри WebBrowser• Невозможно задать заголовочную информацию в WebBrowser• Невозможно открыть MHT-файлы• Следует собирать все ресурсы в единый HTML-файл, включая изображения, используя Data URI, который имеет ограничение в 32КБ
  37. 37. Microsoft Office (Word, Excel, PowerPoint) Позитивные факторы• Работа с документами через COM Негативные факторы• Отсутствует родная поддержка в Silverlight
  38. 38. Microsoft Office (Word, Excel, PowerPoint) Пример обработки Word документаusing (dynamic word =AutomationFactory.CreateObject("Word.Application")){ int wdFormatWebArchive = 9; // MHT fileformat int wdDoNotSaveChanges = 0; // WdSaveOptions do notsave valueusing (dynamic document = word.Documents.Open(tempDoc)) { document.SaveAs("C:t.doc", ref wdFormatWebArchive); } word.Quit(ref wdDoNotSaveChanges);}
  39. 39. События Office Пример обработки Word документаdynamic word = AutomationFactory.CreateObject("Word.Application");word.Visible = true;AutomationEvent searchEvent = AutomationFactory.GetEvent(word, "Quit");searchEvent.EventRaised += (s, a) =>{ MessageBox.Show("Quit");};dynamic document = word.Documents.Open("C:test.doc");
  40. 40. Потоки и BackgroundWorkervar bw = new BackgroundWorker();bw.WorkerReportsProgress = true;bw.DoWork += (s, a) => { var worker = sender as BackgroundWorker; worker.ReportProgress(0, "Сейчас начнем"); MessageBox.Show("Работаем"); worker.ReportProgress(100, «Закончили"); };bw.ProgressChanged += (s, a) => { MessageBox.Show("Current state" + a.ProgressPercentage.ToString()); // сложные объекты могут передаваться в e.UserState };bw.RunWorkerCompleted += (s, a) => { MessageBox.Show("Done"); };bw.RunWorkerAsync(new Dictionary<string, object> { { "file", "test.doc" }, { "region", "Ukraine"} });
  41. 41. Navigation Framework Подключение пространства имен в XAML<UserControl xmlns="" xmlns:x="" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation">
  42. 42. Navigation Framework Добавление Frame<navigation:Frame x:Name="ContentFrame" Source="/Action"> <navigation:Frame.UriMapper> <uriMapper:UriMapper> <uriMapper:UriMapping Uri="" MappedUri="/Pages/Action.xaml"/> <uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Pages/{pageName}.xaml"/> </uriMapper:UriMapper> </navigation:Frame.UriMapper></navigation:Frame> Переход на другую страницуNavigationService.Navigate(new Uri("/INeedThisPage", UriKind.Relative));
  43. 43. Управление окном Ограничение размера окна// App.xamlprivate void Application_Startup(object sender, StartupEventArgs e){ this.RootVisual = new MainPage(); App.Current.Host.Content.Resized += (s, a) => { App.Current.MainWindow.Height = 650; App.Current.MainWindow.Width = 1000; };} Развернуть окноApp.Current.MainWindow.WindowState = WindowState.Maximized;
  44. 44. Notification Windowvar block = new TextBlock();block.Text = "Wassup!";var nw = new NotificationWindow();nw.Height = 50;nw.Width = 300;nw.Content = block;nw.Show(3000);
  45. 45. Поздравляю, вы пережили этот доклад  Евгений Жарков @2j2e Слушай подкаст 2Гига