[WPF] Как обесцветить векторную графику?
От: EqKeeper  
Дата: 06.08.11 16:07
Оценка:
Доброго времени суток!

Намучившись с растровыми изображениями и начитавшись всяких ужасов об их отображении в WPF, я решил перебраться на векторную графику... и с порога столкнулся со следующей задачкой:
Есть ToggleButton. Если она нажата, я хочу, чтобы на ней отображалась одна иконка. Если отжата — другая. Иконки, как уже было помянуто, векторные.

Нарисовал и применил такой вот шаблон:

<ControlTemplate x:Key="saveSettingsButton" TargetType="{x:Type ToggleButton}">
            <ContentPresenter x:Name="image" Content="{StaticResource SaveGrayscaleIcon}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" />
            <ControlTemplate.Triggers>
                <Trigger Property="IsChecked" Value="true">
                    <Setter TargetName="image" Property="Content" Value="{StaticResource SaveIcon}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>


Иконки получены путем сохранения SVG'шных в XAML при помощи Inkscape.

Храню в словаре в таком вот виде:
<Viewbox x:Key="SaveIcon" Stretch="Uniform">
        <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="48" Height="48">
            <Canvas.Resources>
                <RadialGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="radialGradient6719" MappingMode="Absolute" Center="605.71429,486.64789" GradientOrigin="605.71429,486.64789" RadiusX="117.14286" RadiusY="117.14286">
                    <RadialGradientBrush.GradientStops>
...


И все бы было ничего, но:
1) В данном варианте я имею 2 иконки — цветную и чернобелую. Обе занимают место и время загрузки. В перспективе кнопок значительно больше. Да и обесцвечивать вручную каждую иконку откровенно лениво.
2) Почему-то, ведет себя эта конструкция очень странно. При изменении состояния одной кнопки, исчезает другая. Если кнопок несколько — исчезают по одной-несколько в произвольном порядке. Аттрибут x:Shared="false" для Viewbox'а не помогает. =\

Подскажите, гуру, как быть в такой ситуации? Что делать? Хочется и корректного переключения, и смены палитры на серую "на лету".
Re: [WPF] Как обесцветить векторную графику?
От: MxMsk Португалия  
Дата: 07.08.11 11:17
Оценка:
Здравствуйте, EqKeeper, Вы писали:

EK>1) В данном варианте я имею 2 иконки — цветную и чернобелую. Обе занимают место и время загрузки. В перспективе кнопок значительно больше. Да и обесцвечивать вручную каждую иконку откровенно лениво.

Можно использовать шейдерный эффект, типа такого.

EK>2) Почему-то, ведет себя эта конструкция очень странно. При изменении состояния одной кнопки, исчезает другая. Если кнопок несколько — исчезают по одной-несколько в произвольном порядке. Аттрибут x:Shared="false" для Viewbox'а не помогает. =\

Viewbox — не Freezable объект, следовательно он не умеет клонироваться, а потому не сможет присутствовать многократно в разных кнопках. Для чего вообще там Viewbox? Нельзя представить иконку через Geometry?
Re[2]: [WPF] Как обесцветить векторную графику?
От: EqKeeper  
Дата: 07.08.11 12:16
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, EqKeeper, Вы писали:


EK>>1) В данном варианте я имею 2 иконки — цветную и чернобелую. Обе занимают место и время загрузки. В перспективе кнопок значительно больше. Да и обесцвечивать вручную каждую иконку откровенно лениво.

MM>Можно использовать шейдерный эффект, типа такого.

EK>>2) Почему-то, ведет себя эта конструкция очень странно. При изменении состояния одной кнопки, исчезает другая. Если кнопок несколько — исчезают по одной-несколько в произвольном порядке. Аттрибут x:Shared="false" для Viewbox'а не помогает. =\

MM>Viewbox — не Freezable объект, следовательно он не умеет клонироваться, а потому не сможет присутствовать многократно в разных кнопках. Для чего вообще там Viewbox? Нельзя представить иконку через Geometry?

Не знаю. Быть может, и можно.
Я лишь недавно ковыряю WPF, поэтому вывожу так, как получается, стараясь обойтись минимальным объемом кода/xaml'а.
Viewbox использую для того, чтобы ограничить иконку, в противном случае, из-за Canvas в иконках, это чудовище вылезало за отведенные ему границы и плевать хотела на мои Width, MaxWidth, ActualWidth и прочие ограничения. >_>
Изначально вариант был иной — Viewbox я объявлял в ControlTemplate и пытался привязать иконку (ее верхний Canvas) к Child. Оказалось, что это сделать невозможно. Вот и решил пойти другим путем. И он оказался неверен.
Подскажи, пожалуйста, как ее вывести правильно?

За шейдерный эффект спасибо, попробую!
Re[3]: [WPF] Как обесцветить векторную графику?
От: MxMsk Португалия  
Дата: 07.08.11 12:21
Оценка:
Здравствуйте, EqKeeper, Вы писали:

EK>Я лишь недавно ковыряю WPF, поэтому вывожу так, как получается, стараясь обойтись минимальным объемом кода/xaml'а.

EK>Viewbox использую для того, чтобы ограничить иконку, в противном случае, из-за Canvas в иконках, это чудовище вылезало за отведенные ему границы и плевать хотела на мои Width, MaxWidth, ActualWidth и прочие ограничения. >_>
EK>Изначально вариант был иной — Viewbox я объявлял в ControlTemplate и пытался привязать иконку (ее верхний Canvas) к Child. Оказалось, что это сделать невозможно. Вот и решил пойти другим путем. И он оказался неверен.
EK>Подскажи, пожалуйста, как ее вывести правильно?
Выложи сюда полный XAML какой-нибудь из иконок.
Re[4]: [WPF] Как обесцветить векторную графику?
От: EqKeeper  
Дата: 07.08.11 13:39
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, EqKeeper, Вы писали:


EK>>Я лишь недавно ковыряю WPF, поэтому вывожу так, как получается, стараясь обойтись минимальным объемом кода/xaml'а.

EK>>Viewbox использую для того, чтобы ограничить иконку, в противном случае, из-за Canvas в иконках, это чудовище вылезало за отведенные ему границы и плевать хотела на мои Width, MaxWidth, ActualWidth и прочие ограничения. >_>
EK>>Изначально вариант был иной — Viewbox я объявлял в ControlTemplate и пытался привязать иконку (ее верхний Canvas) к Child. Оказалось, что это сделать невозможно. Вот и решил пойти другим путем. И он оказался неверен.
EK>>Подскажи, пожалуйста, как ее вывести правильно?
MM>Выложи сюда полный XAML какой-нибудь из иконок.

<Viewbox x:Key="SaveIcon" Stretch="Uniform">
        <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="48" Height="48">
            <Canvas.Resources>
                <RadialGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="radialGradient6719" MappingMode="Absolute" Center="605.71429,486.64789" GradientOrigin="605.71429,486.64789" RadiusX="117.14286" RadiusY="117.14286">
                    <RadialGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF000000" Offset="0"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </RadialGradientBrush.GradientStops>
                    <RadialGradientBrush.Transform>
                        <!--radialGradient-->
                        <MatrixTransform Matrix="-2.77439, 0, 0, 1.96971, 112.762, -872.885"/>
                    </RadialGradientBrush.Transform>
                </RadialGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient5060" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF000000" Offset="0"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <RadialGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="radialGradient6717" MappingMode="Absolute" Center="605.71429,486.64789" GradientOrigin="605.71429,486.64789" RadiusX="117.14286" RadiusY="117.14286">
                    <RadialGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF000000" Offset="0"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </RadialGradientBrush.GradientStops>
                    <RadialGradientBrush.Transform>
                        <!--radialGradient-->
                        <MatrixTransform Matrix="2.77439, 0, 0, 1.96971, -1891.63, -872.885"/>
                    </RadialGradientBrush.Transform>
                </RadialGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient5048" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#00000000" Offset="0"/>
                            <GradientStop Color="#FF000000" Offset="0.5"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient6715" MappingMode="Absolute" StartPoint="302.85715,366.64789" EndPoint="302.85715,609.50507">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#00000000" Offset="0"/>
                            <GradientStop Color="#FF000000" Offset="0.5"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                    <LinearGradientBrush.Transform>
                        <!--linearGradient-->
                        <MatrixTransform Matrix="2.77439, 0, 0, 1.96971, -1892.18, -872.885"/>
                    </LinearGradientBrush.Transform>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2371" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF000000" Offset="0"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2350" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF858585" Offset="0"/>
                            <GradientStop Color="#FFCBCBCB" Offset="0.5"/>
                            <GradientStop Color="#FF6B6B6B" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2277" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FFFFFFFF" Offset="0"/>
                            <GradientStop Color="#00FFFFFF" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2263" MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="1,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF1E2D69" Offset="0"/>
                            <GradientStop Color="#FF78A7E0" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2269" MappingMode="Absolute" StartPoint="40.884724,71.869133" EndPoint="16.879831,-0.38931385">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF1E2D69" Offset="0"/>
                            <GradientStop Color="#FF78A7E0" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                    <LinearGradientBrush.Transform>
                        <!--linearGradient-->
                        <MatrixTransform Matrix="0.976612, 0, 0, 1.13979, 0.564215, -3.27116"/>
                    </LinearGradientBrush.Transform>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2283" MappingMode="Absolute" StartPoint="13.783585,-0.99672896" EndPoint="33.074715,55.701546">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FFFFFFFF" Offset="0"/>
                            <GradientStop Color="#00FFFFFF" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                    <LinearGradientBrush.Transform>
                        <!--linearGradient-->
                        <MatrixTransform Matrix="0.985432, 0, 0, 1.14818, 0.64107, -2.93388"/>
                    </LinearGradientBrush.Transform>
                </LinearGradientBrush>
                <LinearGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="linearGradient2348" MappingMode="Absolute" StartPoint="20.125,21.84375" EndPoint="28.5625,42.46875">
                    <LinearGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF858585" Offset="0"/>
                            <GradientStop Color="#FFCBCBCB" Offset="0.5"/>
                            <GradientStop Color="#FF6B6B6B" Offset="1"/>
                        </GradientStopCollection>
                    </LinearGradientBrush.GradientStops>
                    <LinearGradientBrush.Transform>
                        <!--linearGradient-->
                        <MatrixTransform Matrix="1.0677, 0, 0, 1.12153, -1.36894, -5.57446"/>
                    </LinearGradientBrush.Transform>
                </LinearGradientBrush>
                <RadialGradientBrush xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Key="radialGradient2377" MappingMode="Absolute" Center="24.3125,41.15625" GradientOrigin="24.3125,41.15625" RadiusX="22.875" RadiusY="22.875">
                    <RadialGradientBrush.GradientStops>
                        <GradientStopCollection>
                            <GradientStop Color="#FF000000" Offset="0"/>
                            <GradientStop Color="#00000000" Offset="1"/>
                        </GradientStopCollection>
                    </RadialGradientBrush.GradientStops>
                    <RadialGradientBrush.Transform>
                        <!--radialGradient-->
                        <MatrixTransform Matrix="1, 0, 0, 0.269126, -1.35227e-16, 30.08"/>
                    </RadialGradientBrush.Transform>
                </RadialGradientBrush>
            </Canvas.Resources>
            <Canvas Name="layer1">
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="rect2259" Fill="{StaticResource linearGradient2269}" Stroke="#FF25375F" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Round" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Data="M 4.5577604 3.5675797 L 43.448063 3.5675797 C 44.037357 3.5675797 44.511771 4.0419938 44.511771 4.6312883 L 44.511771 42.396499 C 44.511771 42.985793 44.037357 43.460207 43.448063 43.460207 L 6.5577604 43.460207 C 6.5577604 43.460207 3.4940519 40.396499 3.4940519 40.396499 L 3.4940519 4.6312883 C 3.4940519 4.0419938 3.9684659 3.5675797 4.5577604 3.5675797 z "/>
                <Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="9" Canvas.Top="4" Width="30" Height="23" Name="rect2328" Fill="#FFFFFFFF" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat"/>
                <Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="9" Canvas.Top="4" Width="30" Height="4" RadiusX="0.12620772" RadiusY="0.12620771" Name="rect2330" Fill="#FFD31C00" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat"/>
                <Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="6" Canvas.Top="6" Width="2" Height="2" RadiusX="0.12620772" RadiusY="0.12620771" Name="rect2332" Fill="#FF000000" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat"/>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path2334" Fill="#FF000000" Stroke="#FF000000" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat" Data="M 11 12.5 L 37 12.5"/>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path2336" Fill="#FF000000" Stroke="#FF000000" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat" Data="M 11 17.5 L 37 17.5"/>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path2338" Fill="#FF000000" Stroke="#FF000000" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat" Data="M 11 22.5 L 37 22.5"/>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="rect2273" Stroke="{StaticResource linearGradient2283}" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Data="M 4.6189226 4.5276647 L 43.387404 4.5276647 C 43.457323 4.5276647 43.513612 4.5839533 43.513612 4.6538724 L 43.513612 42.302111 C 43.513612 42.37203 43.457323 42.428319 43.387404 42.428319 L 6.9282818 42.428319 C 6.9282818 42.428319 4.4927149 40.036946 4.4927149 40.036946 L 4.4927149 4.6538724 C 4.4927149 4.5839533 4.5490035 4.5276647 4.6189226 4.5276647 z "/>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="rect2340" Fill="{StaticResource linearGradient2348}" Stroke="#FF525252" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat" Data="M 14.113967 28.562183 L 33.863791 28.562183 C 34.751762 28.562183 35.466627 29.313093 35.466627 30.245836 L 35.466627 43.447387 C 35.466627 43.447387 12.511131 43.447387 12.511131 43.447387 L 12.511131 30.245836 C 12.511131 29.313093 13.225996 28.562183 14.113967 28.562183 z "/>
                <Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="16" Canvas.Top="30" Width="5" Height="10" RadiusX="0.75120711" RadiusY="0.75120765" Name="rect2359" Fill="#FF4967A2" Stroke="#FF525252" StrokeThickness="1" StrokeMiterLimit="4" StrokeDashOffset="0" StrokeLineJoin="Miter" StrokeStartLineCap="Flat" StrokeEndLineCap="Flat"/>
            </Canvas>
        </Canvas>
    </Viewbox>
Re[5]: [WPF] Как обесцветить векторную графику?
От: MxMsk Португалия  
Дата: 08.08.11 07:19
Оценка: 16 (1) +1
Здравствуйте, EqKeeper, Вы писали:

EK>>>Подскажи, пожалуйста, как ее вывести правильно?

MM>>Выложи сюда полный XAML какой-нибудь из иконок.
Несколько моментов.

Во-первых, Canvas никак не работает с размерами содержимого. Поэтому, если нужно контролировать размеры, надо использовать другой контейнер, например, Grid. Такие свойства, как Canvas.Top/Canvas.Left придется сымитировать через Margin.

Во-вторых, лучше выразить иконки через Freezable. Это сделает их реюзабельными и более быстрыми. Я не знаю, есть ли средства, автоматизирующие это, но можно потратить время и перевести набор Shape-ов в набор геометрий руками. Благо, свойства имеют почти стопроцентное соответствие. Иконку можно представлять в виде DrawingGroup. Из твоего примера у меня вышло нечто такое:
<DrawingGroup x:Key="SaveIcon">
    <GeometryDrawing Brush="{StaticResource linearGradient2269}"
            Geometry="M 4.5577604 3.5675797 L 43.448063 3.5675797 C 44.037357 3.5675797 44.511771 4.0419938 44.511771 4.6312883 L 44.511771 42.396499 C 44.511771 42.985793 44.037357 43.460207 43.448063 43.460207 L 6.5577604 43.460207 C 6.5577604 43.460207 3.4940519 40.396499 3.4940519 40.396499 L 3.4940519 4.6312883 C 3.4940519 4.0419938 3.9684659 3.5675797 4.5577604 3.5675797 z">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF25375F"
        MiterLimit="4"
        LineJoin="Round"
        StartLineCap="Round"
        EndLineCap="Round"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FFFFFFFF">
        <GeometryDrawing.Geometry>
            <RectangleGeometry Rect="9,4,30,23" />
        </GeometryDrawing.Geometry>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FFD31C00">
        <GeometryDrawing.Geometry>
            <RectangleGeometry Rect="9,4,30,4"
                    RadiusX="0.12620772"
                    RadiusY="0.12620771"/>
        </GeometryDrawing.Geometry>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FF000000"
            Geometry="M 11 12.5 L 37 12.5">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF000000"
        MiterLimit="4"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FF000000"
            Geometry="M 11 17.5 L 37 17.5">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF000000"
        MiterLimit="4"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FF000000"
            Geometry="M 11 22.5 L 37 22.5">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF000000"
        MiterLimit="4"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Geometry="M 4.6189226 4.5276647 L 43.387404 4.5276647 C 43.457323 4.5276647 43.513612 4.5839533 43.513612 4.6538724 L 43.513612 42.302111 C 43.513612 42.37203 43.457323 42.428319 43.387404 42.428319 L 6.9282818 42.428319 C 6.9282818 42.428319 4.4927149 40.036946 4.4927149 40.036946 L 4.4927149 4.6538724 C 4.4927149 4.5839533 4.5490035 4.5276647 4.6189226 4.5276647 z">
        <GeometryDrawing.Pen>
            <Pen Brush="{StaticResource linearGradient2283}"
        MiterLimit="4"
        StartLineCap="Round"
        EndLineCap="Round"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Brush="{StaticResource linearGradient2348}"
            Geometry="M 14.113967 28.562183 L 33.863791 28.562183 C 34.751762 28.562183 35.466627 29.313093 35.466627 30.245836 L 35.466627 43.447387 C 35.466627 43.447387 12.511131 43.447387 12.511131 43.447387 L 12.511131 30.245836 C 12.511131 29.313093 13.225996 28.562183 14.113967 28.562183 z">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF525252"
        MiterLimit="4"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    <GeometryDrawing Brush="#FF4967A2">
        <GeometryDrawing.Pen>
            <Pen Brush="#FF525252"
        MiterLimit="4"/>
        </GeometryDrawing.Pen>
        <GeometryDrawing.Geometry>
            <RectangleGeometry Rect="16,30,5,10"
                    RadiusX="0.75120711" 
                    RadiusY="0.75120765"/>
        </GeometryDrawing.Geometry>
    </GeometryDrawing>
</DrawingGroup>


Теперь иконку можно поместить в Image, который потом можно положить в Content кнопки:
<Button>
    <Button.Content>
        <Image>
            <Image.Source>
                <DrawingImage Drawing="{StaticResource SaveIcon}"/>
            </Image.Source>
        </Image>
    </Button.Content>
</Button>


И тогда никаких Viewbox-ов, никаких Canvas-ов не нужно. А также не будет никакого взаимного влияния разных кнопок друг на друга.
Re[6]: [WPF] Как обесцветить векторную графику?
От: EqKeeper  
Дата: 08.08.11 14:55
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Несколько моментов.


MM>Во-первых, Canvas никак не работает с размерами содержимого. Поэтому, если нужно контролировать размеры, надо использовать другой контейнер, например, Grid. Такие свойства, как Canvas.Top/Canvas.Left придется сымитировать через Margin.


MM>Во-вторых, лучше выразить иконки через Freezable. Это сделает их реюзабельными и более быстрыми. Я не знаю, есть ли средства, автоматизирующие это, но можно потратить время и перевести набор Shape-ов в набор геометрий руками. Благо, свойства имеют почти стопроцентное соответствие. Иконку можно представлять в виде DrawingGroup. Из твоего примера у меня вышло нечто такое:

MM>[xml]


MM>И тогда никаких Viewbox-ов, никаких Canvas-ов не нужно. А также не будет никакого взаимного влияния разных кнопок друг на друга.


Понятное дело, что иконку писал не руками. Просто открыл в Inkskape SVG'шную и пересохранил в XAML. Твой вариант, конечно, нравится куда больше. Постараюсь его осмыслить!
Благодарю!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.