C # WPF Использование множественного источника изображений ControlTemplate с Button.Tag - PullRequest
1 голос
/ 10 октября 2019

У меня проблема с использованием ControlTemplate в Button. Я хотел бы создать кнопку с изображением и текстом. При наведении курсора на кнопку изображение меняется. Я использую Button.Tag для передачи источника изображения. Но мне нужно передать два источника изображения. Можно ли создать список источника изображения в Button.Tag и выбрать в ControlTemplate? Спасибо вам.

<Style x:Key="myBtnStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <StackPanel Orientation="Horizontal">
                    <Image x:Name="myImg" Source="{TemplateBinding Tag[0]}" HorizontalAlignment="Left"/>
                    <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Left"/>
                </StackPanel>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="myImg" Property="Source" Value="{TemplateBinding Tag[1]}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Button Content="Click" Style="{StaticResource myBtnStyle}">
    <Button.Tag>
      <ImageSource>/img/usb_white.png</ImageSource>
      <ImageSource>/img/usb_gray.png</ImageSource>
    </Button.Tag>
</Button>    

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Можно установить для свойства Tag значение ImageSource[] с помощью элемента <x:Array>:

<Button Content="Click" Style="{StaticResource myBtnStyle}">
    <Button.Tag>
        <x:Array Type="ImageSource">
            <BitmapImage UriSource="Images/Buldingimage2.jpeg" />
            <BitmapImage UriSource="Images/words.jpg" />
        </x:Array>
    </Button.Tag>
</Button>

Вам также необходимо заменить TemplateBindings в шаблоне с привязками на TemplatedParent:

<Style x:Key="myBtnStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <StackPanel Orientation="Horizontal">
                    <Image x:Name="myImg" Source="{Binding Tag[0], RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left"/>
                    <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Left"/>
                </StackPanel>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="myImg" Property="Source" Value="{Binding Tag[1], RelativeSource={RelativeSource TemplatedParent}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
0 голосов
/ 10 октября 2019
   <Style x:Key="btn_img" TargetType="Button">
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="Margin" Value="3"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="FontWeight" Value="Medium"/>
        <Setter Property="FontSize" Value="12"/>
        <Setter Property="VerticalAlignment" Value="Center"/>

        <Setter Property="Background" Value="WhiteSmoke"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">

                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="5*"/>
                                <ColumnDefinition Width="auto"/>
                            </Grid.ColumnDefinitions>
                            <ContentPresenter Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2 0 0 0">
                            </ContentPresenter>
                            <ContentControl HorizontalAlignment="Left" Grid.Column="1" Content="{TemplateBinding Tag}" Margin="0 0 2 0"/>
                        </Grid>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{StaticResource b_blue}"/>
                <Setter Property="Foreground" Value="#fff"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="Gray"/>
                <Setter Property="Foreground" Value="#fff"/>
            </Trigger>
        </Style.Triggers>
    </Style>
...