Использование DrawingImage в качестве содержимого кнопки в WPF - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу использовать DrawingImage, созданный из SVG, в качестве содержимого для элемента управления WPF Button.Если я устанавливаю DrawingImage в Button.Content, он показывает только имя типа (возможно, просто с помощью .ToString ()):

  using (FileStream stream = new FileStream("test10.svg", FileMode.Open, FileAccess.Read))
  {
    DrawingImage di = SvgReader.Load(stream);
    Button_Test.Content = di;
  }

Что я хочу сделать:

1) Сохранение DrawingImage, которое создается из SVG в ResourceDirectory и связывает его с Button.Content

<Button x:Name="myButton" Content="{StaticResource myDrawingImage}" />

2) Управление DrawingImage для Hover, Buttonpressed, Disabled для визуализации этих состояний

<Style TargetType="Button" x:Key="myDrawingImageButtonStyle">
<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="Button">
      <Grid>
        <VisualStateManager.VisualStateGroups>
          <VisualStateGroup x:Name="CommonStates">
            <VisualState x:Name="Normal"/>
            <VisualState x:Name="Disabled"/>
            <VisualState x:Name="MouseOver">
              <Storyboard>
                ==> ??
              </Storyboard>
            </VisualState>
            <VisualState x:Name="Pressed">
              <Storyboard>
                ==> ??
              </Storyboard>
            </VisualState>
          </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
      </Grid>
    </ControlTemplate>
  </Setter.Value>
</Setter>

Итак, мои вопросы:

A) Как я могу отобразить DrawingImage на моей кнопке
B) Как я могу манипулировать DrawingImage при изменении состояний?

Заранее спасибо,
Фрэнк

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вот как вы можете это сделать

<Style TargetType="Button" x:Key="myDrawingImageButtonStyle">
<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="Button">
        <Image Source="/test10.svg" 
               Width="54" Height="24" x:Name="Image">   
            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal"/>
                <VisualState x:Name="Disabled"/>
                <VisualState x:Name="MouseOver">
                    <Storyboard Storyboard.TargetName="Image" 
                                Storyboard.TargetProperty="Source">
                      <ObjectAnimationUsingKeyFrames>
                        <DiscreteObjectKeyFrame KeyTime="0" Value="/test11.svg"/>
                      </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="Pressed">
                    <Storyboard Storyboard.TargetName="Image" 
                                Storyboard.TargetProperty="Source">
                      <ObjectAnimationUsingKeyFrames>
                        <DiscreteObjectKeyFrame KeyTime="0" Value="/test12.svg"/>
                      </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
      </Image>
    </ControlTemplate>
  </Setter.Value>
</Setter>

PS: не проверено, надеюсь, оно дает верное направление.

0 голосов
/ 27 сентября 2019

Вы должны установить Content на System.Windows.Controls.Image, чтобы иметь возможность отображать его на Button:

Button_Test.Content = new Image { Source = di };
...