Your SlideShare is downloading. ×
Silverlight 4, есть ли жизнь на десктопе
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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


Published on

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

"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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Silverlight 4, есть ли жизнь на десктопе?Евгений ЖарковSilverlight MVP/MCTS
  • 2. Silverlight Windows ПК Phone 7 ВнеБраузер браузера
  • 3. Out of browser (OOB)• Управление окном• Настройка внешнего вида окна• Размещения HTML внутри приложения• Окна уведомлений• Digital Rights Management (DRM)• Расширенные права• Доступ к файловой системе• COM• Интегрированная возможность обновления
  • 4. Активация OOB
  • 5. Конфигурация OOB
  • 6. ИнсталляцияДовели до ума
  • 7. Доступ к буферу обмена Прямой Кросс-доменные Elevated доступ к папке запросы trust User COM
  • 8. Установка доверенных приложений
  • 9. Подпись XAP
  • 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. Тихая установка 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. Тихая установка 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. Тихая установка Silverlight Результирующая строкаSilverlight.exe /q /doNotRequireDRMPrompt
  • 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. 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. Мои документы 我的文件 My Eigene Documents DateienMes docum ents Documents Мои Ταдокументы έγγραφά μου
  • 17. Batch Script User FolderИзвлекаем правильный адрес директории “Мои документы” из реестраFOR /F "tokens=3 delims= " %%G IN (REG QUERY"HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders" /v "Personal") DO (SET docsdir=%%G)
  • 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. Многоязычный интерфейс Добавляем ресурсы с локализованным текстом
  • 20. Многоязычный интерфейс Установить модификатор доступа в Public
  • 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. Многоязычный интерфейс Регистрация ресурса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. Многоязычный интерфейс Переключение языка UIThread.CurrentThread.CurrentUICulture = new CultureInfo("uk-UA");((LocalizationResource)Application.Current.Resources["Localization"]).Strings = new MyApplication.Localization.Strings();
  • 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. 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. 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. 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. Тихая установка 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. Silverlight COM Toolkit
  • 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. 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. 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. Работа с документами PDFXPS Desktop Microsoft Application Office HTML
  • 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. PDF Позитивные факторы• Бесплатные компоненты для обработки PDF-документа• Возможность разместить документ в WebBrowser при наличии Adobe Acrobat плагина Негативные факторы• Платные компоненты для обработки и отображения в Silverlight-приложении
  • 36. HTML Позитивные факторы• Возможно разместить внутри элемента управления WebBrowser Негативные факторы• Невозможно открывать локальные файлы внутри WebBrowser• Невозможно задать заголовочную информацию в WebBrowser• Невозможно открыть MHT-файлы• Следует собирать все ресурсы в единый HTML-файл, включая изображения, используя Data URI, который имеет ограничение в 32КБ
  • 37. Microsoft Office (Word, Excel, PowerPoint) Позитивные факторы• Работа с документами через COM Негативные факторы• Отсутствует родная поддержка в Silverlight
  • 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. События 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. Потоки и 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. 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. 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. Управление окном Ограничение размера окна// 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. 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. Поздравляю, вы пережили этот доклад  Евгений Жарков @2j2e Слушай подкаст 2Гига