Connect(); 2017

Rok se s rokem sešel a přinesl nám další, již čtvrtý, ročník oblíbené vývojářské konference Microsoft Connect . Ve dnech 15. – 17. listopadu jste mohli on-line sledovat novinky od Microsoftu pro všechny vývojáře, na všech platformách.

Dvě hlavní keynote byly věnovány inteligentnímu cloudu a vývoji inteligentních aplikací budoucnosti. Pojďmě se podívat, co nám Scott Guthrie (samozřejmě ve svém oblíbeném červeném polo triku) a další řečníci představili. Pokračovat ve čtení “Connect(); 2017”

Použití vlastního nuget.exe v konfiguraci buildu na VSTS

Krátce po vydání Visual Studia 2017 přidal tým Visual Studio Team Service nový hostovaný build agent Hosted VS2017 který zahrnuje podporu pro všechny nejnovější verze vývojářských nástrojů Microsoftu. Bohužel, přestožee build task pro Visual Studio build novou verzi 2017 podporuje, nejnovější verze NuGetu ještě přidána nebyla. Naštěstí je ale možné při buildu použít vlastní nuget.exe a použít jej pro restore balíčků projetku, který používá nové <PackageReference> v projektovém souboru csproj. Pokračovat ve čtení “Použití vlastního nuget.exe v konfiguraci buildu na VSTS”

Vytvoření boot entry bez Hyper-V pomocí PowerShell skriptu

Často potřebuji na jedom počítači spouštět virtuální stroje pomocí VirtualBoxu a emulátory Windows Mobile běžící pod Hyper-V. Bohužel současně může být povolen pouze jeden z nich. Nejjednodušší řešení je vytvoření dvou boot entries – jeden se zapnutým a jeden s vypnutým Hyper-V.

Příkazová řádka

Skvělý Scott Hanselman popsal rychlý způsob pro vytvoření sekundráního boot entry pomocí příkazové řádky na svém blogu.

Jako součást tvorby svého PowerShell Chocolatey instalačního skriptu pro usnadnění nastavení čisté instalace Windows jsem chtěl tuto úlohu zautomatizovat (a vyhnout se nutnosti copy-paste).

PowerShell skript

Skript je velmi jednoduchý:

První řádka skriptu spouští nástroj  bcdedit  a vytváří kopii aktuálního boot entryVýsledkem je řetězec následujícího tvaru:

Potřebujeme vyparsovat identifikátor mezi složenými závorkami. S tím nám vypomohou regulární výrazy na druhém řádku skriptu. Nalezené výsledky jsou uloženy v proměnné  $matches .

Nakonec použijeme nalezený identifikátor pro modifikaci nového boot entry s příkazem pro zakázání Hyper-V.

A to je vše! Snadné, ale pohodlné. Skript můžete snadno spustit a nový boot entry bez Hyper-V se automaticky vytvoří. Nezapomeňte skript spouštět s administrátorskými právy.

Skript si můžete stáhnout zde.

C#: Návrhový vzor Builder s dědičností

Návrhový vzor Builder je velmi užitečný v případě, že potřebujeme zapouzdřit a zjednodušit konstrukci složitějšího objektu. Spolu s návrhovým vzorem fluent interface nám umožní vytvořit praktické API, které může být součástí knihovny a je okamžitě pochopitelné pro ostatní vývojáře. Co když však přidáme dědičnost? Pokračovat ve čtení “C#: Návrhový vzor Builder s dědičností”

Zúčastněte se “Know It. Prove It.” v únoru 2016

Microsoft Virtual Academy letošní únor opět hostuje skvělý “Know it. Prove it.” challenge!

Tato akce vám dává možnost připojit se k tisícům dalších vývojářů s velkolepým cílem – naučit se nové technologii a rozšířit své obzory za 29 dnů pomocí skvělých kurzů a studijních cest, které nabízí MVA. Proto se zaregistrujte již nyní a udělejte z února měsíc učení novým znalostem!

knowit

Jak zobrazit dotykovou klávesnici při práci s TextBoxy ve WPF

Aktualizováno – listopad 2016 – .NET Framework 4.6.2

Aplikace ve WPF (Windows Presentation Foundation) mají ve světě dotykových obrazovek zatím trochu těžký život. V případě WinRT aplikací se panel s dotykovou obrazovkou zobrazí automaticky, kdy je aktivováno kterékoliv textové pole v aplikaci, aby uživatel nemusel přerušovat své workflow a všechny úkony mohl provádět jen dotykem. Pro klasické desktopové aplikace je ale situace trochu komplikovanější – textová pole klávesnici automaticky nezobrazí a je tak na uživateli, aby ji otevřel sám. A to je nepraktické.

TouchKeyboard
Hej! Jak tě zobrazím ve své WPF aplikaci?

Pro tento problém existují dvě různá řešení.

Trošku hackovací řešení

První řešení vyžaduje trochu hraní se systémem. Nejdříve je nutné vypnout podporu pro použití pera jako vstupního zařízení v naší aplikaci a následně je možné vynutit, aby se textová pole chovala stejně jako ve WinRT pomocí nativních Windows API. To samozřejmě zahrnuje nutnost provést COM import příslušných nativních funkcí systému. Celý proces je velmi dobře popsán zde na blogu Briana Lagunase a doporučuji vám jej vyzkoušet. Pokud vám řešení bude vyhovovat, skvěle!

Nevýhodou tohoto řešení, kterou jsem náhodou objevil, je fakt, že vypnutí podpory pera z nějakého důvodu zablokuje možnost dotykového “scrollování” skrz ovladací prvky typu ListBox. Kterýkoliv pokus o scrollování tímto způsobem způsobí volání události ItemClick na položkách seznamu, kterých se dotkneme. Uživatel pak může scrollovat pouze malým posuvníkem seznamu, který je pro dotyk nevhodný.

Jednoduchá, ale více manuální cesta

Abychom obešli problémy, které přícházejí po vypnutí podpory pera ve WPF aplikaci (případně pokud tuto podporu vyžadujeme), můžeme jít na celý problém jednodušší cestou, ač s trochu méně automaticky. Vytvoříme vlastní implementaci TextBoxu:

Jak to funguje?

Když TextBox získá focus po dotyku uživatele, je zavolána událost GotTouchCapture. V zpracování této události můžeme manuálně spustit proces dotykové klávesnice. Ta je totiž normální spustitelnou aplikací na cestě  “C:\Program Files\Common Files\Microsoft Shared\Ink\TabTip.exe”.

Toto řešení je velmi jednoduché a nevyžaduje žádné explicitní “hackování”. Jedinou nevýhodou je, že vy jako vývojář musíte vždy pamatovat, abyste namísto klasického TextBoxu používali tuto modifikovanou verzi pokaždé, kdy je vyžadováno správné dotykové chování.

Ukončení procesu

Logickým rozšířením tohoto řešení je zabití procesu dotykové klávesnice ve chvíli, kdy ji již nepotřebujeme – tedy když vstupní pole ztratí focus. Metoda Process.Start( string ) vrací instanci třídy Process, která má instanční metodu Kill() . Tato metoda ukončí proces jež instance představuje.

Nejprve potřebujeme zajistit, abychom k instanci procesu měli přístup:

Nyní jen napojíme událost LostFocus:

 

Aktualizováno – co Windows 10?

Ve Windows 10 se tento problém stává spíše kosmetickou vadou díky novému Režimu tabletu.

Režim tabletu

tablet-modeNejnovější verze Windows přináší nový Režim tabletu, do kterého se lze přepnout pomocí tlačítka v Centru akcí nebo přes aplikaci Nastavení. Přestože tento mód někteří vidí jako nevýhodu oproti Windows 8.1, umožňuje výrazně intuitivnější integraci nových Windows Store aplikací a klasických desktopových aplikací. Každá aplikace se ve výchozí podobě spouští v režimu celé obrazovky, ale je stále možné spouštět dvě aplikace vedle sebe. Jednou z velmi pěkných výhod Režimu tabletu je fakt, že dotyková klávesnice na obrazovce se zobarzuje automaticky, když jakýkoliv textový prvek dostane focus, a to nezávisle na typu aplikace. Tímto můžete přenechat kontrolu nad zobrazením klávesnice systému samotnému a usnadnit si tak výrazně práci. Jedinou nevýhodou je to, že i přes talbetové zobrazení klávesnice na rozdíl od Windows Store aplikací překrývá obsah okna nad kterým je zobrazena a neposune jej nahoru, ani ve chvíli, kdy je připnuta ke spodní straně obrazovky. Může se tak stát, že kontextová menu a drop-down seznamy skončí pod klávesnicí a uživatel je tak nucen ji pro pokračování manuálně uzvařít.

Mimo Režim tabletu

Ale co v případě, že Režim tabletu z nějakého důvodu nechcete nebo nemůžete použít? Jedno nenápadné nastavení nás zachrání!

Otevřete aplikaci Nastavení, přejděte do sekce Zařízení a vyberte Psaní – zde skrolujte dolů a úplně na konci najdete nastavení, které je ve výchozím stavu vypnuto (bohužel nechápu z jakého důvodu) – po povolen tohoto nastavení se dotyková klávesnice zobrazí automaticky ve chvíli, kdy se prstem spustí zadávání textu a není připojena žádná klávesnice. Toto je perfektní řešení pro většinu případů a používání klasických aplikací na dotykovém zařízení to dělá intuitivním a konzistentním.touch

Aktualizováno – .NET Framework 4.6.2

V srpnu 2016 Microsoft oznámil novou aktualizaci .NET Framework 4.6.2. Kromě velmi užitečného rozšíření WPF o podporu Per-Monitor DPI tato aktualizace také adresovala problém s klávesnicí na dotykovém zařízení.

WPF aplikace cílené na novou verzi frameworku podporují automatickou invokaci a skrytí dotykové klávesnice stejně tak jako je to u nových UWP aplikací, takže výše uvedená řešení již nejsou pro nové aplikace nutná.

softkeyboard

Podmíněné kopírování nativních knihoven

Při práci s nativními knihovnami závislými na architektuře projektu (jako je například SQLite) často potřebujeme zkopírovat do výstupní složky projektu korektní DLL soubory, které chceme využívat pro vybraný typ procesorové architektury. Ale jak toho dosáhnout jednoduše bez nutnosti manuálního kopírování? Odpovědí jsou “Pre-build event commands” ve Visual Studiu.

Nejprve si vytvořte složku pro knihovnu kterou chcete kopírovat a do ní vytvořte podsložky odpovídající architekturám, které podporuje. Do každé z těchto podsložek vložte DLL a podpůrné soubory dané knihovny.

sqlite

Nyní klikněte pravým tlačítkem myši ve Visual Studiu na kořen projektu v Solution Exploreru a vyberte Properties. V otevřeném okně vlastností projektu vyberte v levém panelu záložku Build Events. Objeví se před vámi dvě prázdné textové oblasti. Do nich můžete zapisovat příkazy, které se provedou před, respektive po sestavení projektu.

Build

Klikněte nyní na tlačítko Edit Pre-build … a můžete začít vkládat své příkazy. Pro naše účely bude dostačující využít jednoduchý ale mocný systémový nástroj xcopy pro zkopírování souborů ze složky s naší knihovnou do složky výstupu projektu:

Vysvětleme si, co tento příkaz provádí. Xcopy má dva hlavní parametry – zdroj kopírování a cíl kopírování. Moje složka sqlite je umístěna ve složce libs, která je ve stromové struktuře o úroveň výše než hlavní složka projektu (kterou specifikujeme řetězcem “$(ProjectDir)”) – tedy nejprve přejdu o úroveň výše sekvencí “..\”, pak odsud do “libs\sqlite\”. Zde musím vejít do podsložky odpovídající architektuře projektu. Odpovídající řetězec “x64”, “x86”, či jiný získáme makrem “$(PlatformName)”. Nyní konečně vybereme pro kopírování všechny soubory v této složce pomocí hvězdičky (“*”). Cílová složka pro kopírování je výstupní složka projektu, označovaná makrem “$(TargetDir)”. Nakonec ještě přidávám dvě volby: “/E” (aby se při kopírování zahrnuly mezi zdroje i podsložky) a “/Y” (abychom vždy přepsali existující soubory v cílové složce).

Nyní před každým sestavením projektu bude náš příkaz proveden a soubory zkopírovány. Vše probíhá automaticky bez nutnosti další manuální práce.

Na závěr ještě podotknu, že je možné samozřejmě provádět i více příkazů – každý prostě uveďte na nový řádek, a lze v pre-build a post-build akcích provádět takřka cokoliv co dovoluje příkazová řádka – není nutné se omezit na kopírování.