Всім добрий день. Я хочу представити на суд громадськості (ще один) простий спосіб зробити локалізацію додатків. Стандартний механізм з ресурсними збірками мене не влаштовує з наступних причин:
  1. Отримуючи значення локалізованої рядка в коді, дуже хочеться покладатися на всю міць ООП і підказки компілятора. Дуже неприємно зібрати проект ввечері в п'ятницю, а вранці в суботу отримати дзвінок від впахивающих overtime QA на тему того, що хтось неуважний написав GetResource(«asdf») замість GetResource(«assf»), і тепер щось падає або неправильне, а проект в понеділок вже здавати у друк ...
  2. (В продовження попереднього пункту...) Писати string foo = language.Ui.PromtDialog.AdditionalQuestion просто приємніше, ніж string foo = Resources.GetResource(«Ui_PromtDialog_AdditionalQuestion»). Так, в тому числі і за рахунок підказок компілятора.
  3. Іноді локалізувати потрібно не рядки, а цілі об'єкти. Наприклад, іменник (рядок + рід М/Ж/З/Мн) і прикметник (рядок М + рядок Ж + рядок З + рядок Мн). Пхати в ресурси сериализованную рядок, а потім діставати і десериализовать кожен раз? Мсьє знає толк в збоченнях...
  4. Ресурсний файл — це плоский список рядків, а хотілося б, щоб все-таки мали більш складну ієрархічну структуру, за якої не потрібно повзати з допомогою Ctrl+F.
  5. Створення нової мови має бути настільки простим, наскільки це можливо. Локалізувати додаток повинен бути здатний людина, що вміє поводитися з комп'ютером і володіє потрібними мовами. І йому для цього не потрібні ні Visual Studio, ні метушня з створенням ресурсних збірок.
Ще одна обов'язкова вимога — можливість простій прив'язки до локалізації елементів UI. Бажано — одночасно і WPF, і WinForms.

Читати далі →

Слухаємо користувальницький введення з допомогою "Raw Input API" для управління фоновим додатком


Мабуть, майже не залишилося людей, які не знають, що таке Ctrl+C і Ctrl+V. Більш досвідчені користувачі знають гарячі клавіші часто використовуваних додатків. Є ті, хто використовує більш складні комбінації: наприклад, для управління плеєром, які перебувають у тлі. Для розробників реалізація подібного функціоналу зазвичай не викликає великих труднощів, оскільки ця задача широко поширена, а про її вирішення вже багато написано. Але як бути, якщо треба в згорнутому стані слухати користувальницький введення з джойстика або презентер, та до того ж ще й розбиратися, від якого саме пристрої прийшло подія? Скажімо чесно, для нас ця задача виявилася чимось новим. Під катом ми розповімо, як ми її вирішили на C# в WPF додатку за допомогою "Raw Input API".

Читати далі →

WPF — Floppy Pages

Реалізація нового Frame в стилі IOS
Або простіше кажучи — Frame в стилі Modern UI.

Доброго дня. Мене звати Андрій і я дуже втомився користуватися стандартним VK на Windows 10. Його горизонтальна навігація мене втомила і як то вона не вписується в загальний дизайн. Ще дуже давно хотів реалізувати таку справу, а саме: плавна навігація як на iPhone. Для чого? Для того, що я хочу зробити свій VK клієнт на WPF. Для початку покажу загальну картину:
image
Можна зробити висновок, що такий підхід буде дуже зручним. DataContext між сторінками буде передаватися через конструктор, але далі буде цікавіше.

Почну з namespace UFC.UI. Так як на кожній сторінці може знаходитися декілька кнопок, то мені довелося створити інтерфейс:


Читати далі →

Ко-ітератори на таймерах

попередній статті я навів приклад функції-ітератора, исполняющейся події від DispatcherTimer. Мені стало цікаво розвинути цю ідею далі. Кілька таких функцій з незалежними таймерами утворюють систему з кооперативної багатозадачністю. Далі будемо називати такі функції ко-итераторами.

Читати далі →

TextBlock з підсвічуванням тексту (WPF)

Привіт Хабр! Я створив контрол на основі TextBlock з можливістю підсвічування тексту. Для початку наведу приклад його використання, потім опишу, як він створювався.

Приклад використання контрола
<local:HighlightTextBlock TextWrapping="Wrap">
<local:HighlightTextBlock.HighlightRules>
<local:HighlightRule HightlightedText="{Binding Filter, Source={x:Reference thisWindow}}">
<local:HighlightRule.Highlights>
<local:HighlightBackgroung Brush="Yellow"/>
<local:HighlightForeground Brush="Black"/>
</local:HighlightRule.Highlights>
</local:HighlightRule>
</local:HighlightTextBlock.HighlightRules>
<Run FontWeight="Bold">Property:</Run>
<Run Text="{Binding Property}"/>
</local:HighlightTextBlock>


Початок розробки
Знадобилося мені підсвітити текст TextBlock, введений в рядок пошуку. На перший погляд завдання здалася простий. Прийшло в голову розділити текст на 3 елемента Run, які б передавали в конвертер весь текст, рядок пошуку і своє положення (1/2/3). Середній Run має Backgroung.

Не встиг я приступити до реалізації, як прийшла в голову думка, що варіантів може бути кілька. А значить такий підхід не підходить.

Була ще думка формувати Xaml «на льоту», парсити його за допомогою XamlReader і кидати в TextBlock. Але ця думка теж відразу відпала, бо пахне.

Наступною (остаточної) ідеєю стало створити систему правил підсвічування і прикрутити її до TextBlock. Тут 2 варіанти: свій контрол з блекджеком і дівчатками на основі TextBlock або AttachedProperty. Після недовгих роздумів, я вирішив, що все-таки краще створити окремий контрол, тому що функціонал підсвічування може накласти деякі обмеження на функціональність самого TextBlock, а розрулювати це простіше, якщо від нього унаследоваться.

Читати далі →

Помічники на кожен день

Деякі завдання зустрічаються при написанні коду так часто, що інструменти для їх вирішення повинні бути особливо зручні. І якщо стандартні інструменти мови/платформи розробки здаються незадовільними, то програміст пише свої рішення, які, в силу частоти використання, стають його улюбленими велосипедами. Тому перше, що він робить при зміні мови/платформи, це шукає місцеві аналоги своїх рішень, або можливості їх відтворити.

Уявляю свою колекцію помічників для виконання рутинних завдань, що склалася після міграції з C++ Builder C#, WPF.

Читати далі →

Проектування ідентичних форм в WPF із застосуванням абстрактних класів

Нещодавно зіткнувся з вельми цікавою задачею, яка досить-таки часто може зустрічатися при проектуванні інтерфейсів користувача. Питання, звичайно, порівняно тривіальний, однак повноцінною і розгорнутої інформації за нього я не знайшов, тому вирішив поділитися власним досвідом. Стаття може бути корисною для Junior-розробників, а також людей, тільки початківців вивчати ООП і не мають серйозного практичного досвіду у програмуванні.

Читати далі →

Введення в ReactiveUI: вивчаємо команди

Частина 1: Введення в ReactiveUI: прокачуємо властивості під ViewModel
Частина 2: Введення в ReactiveUI: колекції

Ми вже обговорили можливості ReactiveUI, пов'язані з роботою з властивостями, вибудовуванням залежностей між ними, а також з роботою з колекціями. Це одні з основних примітивів, на базі яких будується розробка із застосуванням ReactiveUI. Ще одним таким примітивом є команди, які ми і розглянемо в цій частині. Команди інкапсулюють дії, які виробляються у відповідь на деяку подію: зазвичай це запит користувача або якісь відстежуються зміни. Ми дізнаємося, що можна зробити за допомогою команд в ReactiveUI, обговоримо особливості їх роботи і з'ясуємо, чим команди в ReactiveUI відрізняються від команд, з якими ми знайомі з WPF і його родичам.
Але перш ніж перейти до команд, розглянемо більш широкі теми, що стосуються реактивного програмування в цілому: зв'язок між Task<T> і IObservable<T>, і що таке гарячі і холодні послідовності.

Читати далі →

Перевіряємо вихідний код WPF Samples від Microsoft

З метою популяризації аналізатора коду PVS-Studio, який навчився перевіряти крім C++, ще і C# проекти, ми вирішили перевірити вихідний код WPF прикладів, пропонованих компанією Microsoft.



З виходом Windows Vista, була представлена нова система для побудови красивих клієнтських додатків — Windows Presentation Foundation (WPF). Дана графічна підсистема включена до складу .NET Framework починаючи з версії 3.0. Вона використовує мову розмітки XAML і прийшла на зміну застарілому WinForms. На мій погляд, основним недоліком WinForms було те, що він здійснював всю промальовування на центральному процесорі. WPF надходила більш логічно і віддавала промальовування своїх компонентів DirectX. Зараз WPF практично витіснило WinForms і дозволяє робити універсальні інтерфейси відразу для трьох платформ PC, XBOXOne, Winphone).

Читати далі →

Введення в ReactiveUI: колекції

Привіт, Хабр!

Частина 1: Введення в ReactiveUI: прокачуємо властивості під ViewModel

У попередній статті ми поговорили про властивості під ViewModel, і що ми можемо з ними зробити, використовуючи ReactiveUI. У нас вийшло привести в порядок залежності між властивостями і зібрати в одному місці вьюмодели інформацію про те, які в ній існують залежності між властивостями.
В цей раз ще трохи поговоримо про властивості, а потім перейдемо до колекцій. Спробуємо зрозуміти, які проблеми є з звичайними колекціями, і навіщо було створювати нові, з повідомленнями про зміни. І, звичайно, спробуємо їх використовувати.

Читати далі →