Хтось може описати рекомендовану крок за кроком процедуру для цього?
РЕДАГУВАТИ:
Крок 1. Перетворити SVG на XAML ... це просто
Крок 2. Що тепер?
Хтось може описати рекомендовану крок за кроком процедуру для цього?
РЕДАГУВАТИ:
Крок 1. Перетворити SVG на XAML ... це просто
Крок 2. Що тепер?
Відповіді:
Ваша техніка буде залежати від того, який об'єкт XAML виробляє ваш конвертер SVG в XAML. Це створює малюнок? Зображення? Сітка? Полотно? Шлях? Геометрія? У кожному випадку ваша техніка буде різною.
У наведених нижче прикладах я припускаю, що ви використовуєте свою піктограму на кнопці, що є найпоширенішим сценарієм, але зауважте, що ті самі методи будуть працювати для будь-якого ContentControl.
Використання малюнка як значка
Щоб використовувати Малюнок, намалюйте прямокутник відповідного розміру пензлем:
<Button>
<Rectangle Width="100" Height="100">
<Rectangle.Fill>
<DrawingBrush>
<DrawingBrush.Drawing>
<Drawing ... /> <!-- Converted from SVG -->
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
</Button>
Використання зображення як значка
Зображення можна використовувати безпосередньо:
<Button>
<Image ... /> <!-- Converted from SVG -->
</Button>
Використання сітки як значка
Сітку можна використовувати безпосередньо:
<Button>
<Grid ... /> <!-- Converted from SVG -->
</Button>
Або ви можете включити його у вікно перегляду, якщо вам потрібно контролювати розмір:
<Button>
<Viewbox ...>
<Grid ... /> <!-- Converted from SVG -->
</Viewbox>
</Button>
Використання полотна як значка
Це як при використанні зображення або сітки, але оскільки полотно не має фіксованого розміру, вам потрібно вказати висоту та ширину (якщо вони вже не встановлені конвертером SVG):
<Button>
<Canvas Height="100" Width="100"> <!-- Converted from SVG, with additions -->
</Canvas>
</Button>
Використання контуру як значка
Ви можете використовувати шлях, але ви повинні чітко встановити обведення або заповнити:
<Button>
<Path Stroke="Red" Data="..." /> <!-- Converted from SVG, with additions -->
</Button>
або
<Button>
<Path Fill="Blue" Data="..." /> <!-- Converted from SVG, with additions -->
</Button>
Використання геометрії як значка
За допомогою Шляху можна намалювати геометрію. Якщо його слід погладити, встановіть Обведення:
<Button>
<Path Stroke="Red" Width="100" Height="100">
<Path.Data>
<Geometry ... /> <!-- Converted from SVG -->
</Path.Data>
</Path>
</Button>
або якщо його слід заповнити, встановіть Заповнення:
<Button>
<Path Fill="Blue" Width="100" Height="100">
<Path.Data>
<Geometry ... /> <!-- Converted from SVG -->
</Path.Data>
</Path>
</Button>
Як прив'язувати дані
Якщо ви виконуєте перетворення SVG -> XAML у коді і хочете, щоб результуюча XAML відображалася із використанням прив'язки даних, використовуйте одне з наступного:
Прив'язка креслення:
<Button>
<Rectangle Width="100" Height="100">
<Rectangle.Fill>
<DrawingBrush Drawing="{Binding Drawing, Source={StaticResource ...}}" />
</Rectangle.Fill>
</Rectangle>
</Button>
Прив'язка зображення:
<Button Content="{Binding Image}" />
Прив'язка сітки:
<Button Content="{Binding Grid}" />
Прив’язка сітки до вікна перегляду:
<Button>
<Viewbox ...>
<ContentPresenter Content="{Binding Grid}" />
</Viewbox>
</Button>
Переплетення полотна:
<Button>
<ContentPresenter Height="100" Width="100" Content="{Binding Canvas}" />
</Button>
Прив’язка шляху:
<Button Content="{Binding Path}" /> <!-- Fill or stroke must be set in code unless set by the SVG converter -->
Прив'язка геометрії:
<Button>
<Path Width="100" Height="100" Data="{Binding Geometry}" />
</Button>
<ResourceDictionary><DataTemplate x:Key="MyIconTemplate"><Canvas ... /></DataTemplate></ResourceDictionary>
... <Button><ContentPresenter ContentTemplate="{StaticResource MyIconTemplate}" /></Button>
.
<ResourceDictionary><VisualBrush x:Key="MyBrush"><VisualBrush.Visual><Canvas x:Key="MyCanvas" ... /></VisualBrush.Visual></VisualBrush></ResourceDictionary>
... <Button><Rectangle Fill="{StaticResource MyBrush}" Width="..." Height="..." /></Button>
. Це складніше, оскільки ви також повинні переконатися, що полотно вимірюється / упорядковано, і ви повинні жорстко кодувати ширину / висоту (або використовувати шаблон для прямокутника).
Canvas
об’єкта, куди я можу поставити SVG? Це важливо, тому що всі мої SVG знаходяться у статичних ресурсах, і мені потрібно їх вбудовувати ...
Install-Package SharpVectors
<UserControl xmlns:svgc="http://sharpvectors.codeplex.com/svgc">
<svgc:SvgViewbox Source="/Icons/icon.svg"/>
</UserControl>
Windows 10 build 15063 "Creators Update" спочатку підтримує зображення SVG (правда, з певними помилками) для програм UWP / UAP, орієнтованих на Windows 10.
Якщо ваш додаток є додатком WPF, а не UWP / UAP, ви все одно можете використовувати цей API (після переходу через чималу кількість обручів): Windows 10 build 17763 "Оновлення жовтня 2018 року" представило концепцію островів XAML (як " технологія попереднього перегляду, але я вважаю, що це дозволено в магазині програм; у всіх випадках з Windows 10 build 18362 «Оновлення від травня 2019 р.» Острови XAML більше не є функцією попереднього перегляду і повністю підтримуються), що дозволяє використовувати API та елементи керування UWP у своєму WPF додатків.
Вам потрібно спочатку додати посилання на API WinRT та використовувати певні API Windows 10, які взаємодіють із користувацькими даними або системою (наприклад, завантаження зображень з диска у веб-перегляді UWP Windows 10 або використання API-повідомлень тостів для показу тостів), вам також потрібно пов’язати свою програму WPF з ідентифікацією пакета, як показано тут (надзвичайно простіше у Visual Studio 2019). Однак це не повинно бути необхідним для використання Windows.UI.Xaml.Media.Imaging.SvgImageSource
класу.
Використання (якщо ви користуєтеся UWP або дотримувались наведених вище вказівок і додали підтримку острова XAML під WPF), це просто, як встановити Source
a <Image />
до шляху до SVG. Це еквівалентно використанню SvgImageSource
наступного:
<Image>
<Image.Source>
<SvgImageSource UriSource="Assets/svg/icon.svg" />
</Image.Source>
</Image>
Однак зображення SVG, завантажені таким чином (через XAML) можуть завантажувати нерівні / псевдоніми . Одним із обхідних шляхів є вказання значення RasterizePixelHeight
або, RasterizePixelWidth
яке подвоєне + ваша фактична висота / ширина:
<SvgImageSource RasterizePixelHeight="300" RasterizePixelWidth="300" UriSource="Assets/svg/icon.svg" /> <!-- presuming actual height or width is under 150 -->
Це можна обійти динамічно, створивши нове SvgImageSource
у ImageOpened
події для базового зображення:
var svgSource = new SvgImageSource(new Uri("ms-appx://" + Icon));
PrayerIcon.ImageOpened += (s, e) =>
{
var newSource = new SvgImageSource(svgSource.UriSource);
newSource.RasterizePixelHeight = PrayerIcon.DesiredSize.Height * 2;
newSource.RasterizePixelWidth = PrayerIcon.DesiredSize.Width * 2;
PrayerIcon2.Source = newSource;
};
PrayerIcon.Source = svgSource;
Псевдонім може бути важко побачити на екранах, що не мають високих точок на дюйм, але ось спробу це проілюструвати.
Це результат наведеного вище коду: an, Image
який використовує початковий код SvgImageSource
, а другий Image
під ним використовує SvgImageSource, створений уImageOpened
події:
Це підірваний вид верхнього зображення:
Тоді як це підірваний вигляд нижнього (згладженого, правильного) зображення:
(вам потрібно буде відкрити зображення на новій вкладці та переглянути в повному розмірі, щоб оцінити різницю)
Ви можете використовувати отриманий xaml із SVG як пензлик для малювання на прямокутнику. Щось на зразок цього:
<Rectangle>
<Rectangle.Fill>
--- insert the converted xaml's geometry here ---
</Rectangle.Fill>
</Rectangle>
Використовуйте розширення SvgImage або SvgImageConverter, SvgImageConverter підтримує прив'язку. Див. Таке посилання для зразків, що демонструють обидва розширення.
https://github.com/ElinamLLC/SharpVectors/tree/master/TutorialSamples/ControlSamplesWpf
Інша альтернатива - dotnetprojects SVGImage
Це дозволяє власне використання файлів .svg безпосередньо в xaml.
Приємна частина - це лише одна збірка, яка становить близько 100 тис. На відміну від різких векторів, який набагато більший за будь-які файли.
Використання:
...
xmlns:svg1="clr-namespace:SVGImage.SVG;assembly=DotNetProjects.SVGImage"
...
<svg1:SVGImage Name="mySVGImage" Source="/MyDemoApp;component/Resources/MyImage.svg"/>
...
Це все.
Подивитися:
Ми можемо використовувати безпосередньо код шляху з коду SVG:
<Path>
<Path.Data>
<PathGeometry Figures="M52.8,105l-1.9,4.1c ...