Имя кнопки ссылки в DataTrigger - PullRequest
0 голосов
/ 02 июня 2018

У меня есть стилизованная кнопка следующим образом:

<Style x:Key="btnDefaultOperationImage" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Name="brdMenu"
                        BorderThickness="0"
                        Padding="4,2"
                        BorderBrush="White"
                        Background="#20000000">
                    <StackPanel>
                        <ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center">
                            <ContentPresenter.Resources>
                                <Style TargetType="TextBlock">
                                    <Setter Property="TextAlignment" Value="Center" />
                                </Style>
                            </ContentPresenter.Resources>
                        </ContentPresenter>
                        <Image>
                            <Image.Style>
                                <Style TargetType="{x:Type Image}">
                                    <Setter Property="Source" Value="/Images/Icons/CourtHearing.png" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Name}" Value="btnCases">
                                            <Setter Property="Source" Value="/Images/Icons/Cases.png"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Image.Style>
                        </Image>
                    </StackPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="brdMenu" Property="BorderBrush" Value="#F2826A"/>
                        <Setter TargetName="brdMenu" Property="Background" Value="#30000000"/>
                        <Setter TargetName="brdMenu" Property="TextElement.FontSize" Value="25"/>
                        <Setter TargetName="brdMenu" Property="TextElement.Foreground" Value="AntiqueWhite"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="brdMenu" Property="BorderBrush" Value="OrangeRed" />
                        <Setter TargetName="brdMenu" Property="Background" Value="White" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <!--<Setter TargetName="brdMenu" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />-->
                        <Setter TargetName="brdMenu" Property="Background" Value="#f9f9f9" />
                        <Setter TargetName="brdMenu" Property="Opacity" Value="0.3" />
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Я хочу использовать этот стиль на многих кнопках, но каждая кнопка будет иметь свое изображение в соответствии с ее именем, например:

  • Кнопка Name="btnCases" ImageSource="..\..\Cases.png"
  • Кнопка Name="btnActors" ImageSource="..\..\Actors.png"

Мне интересно, возможно ли использовать DataTrigger Чтобы решить эту проблему, я попытался

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Name}" Value="btnCases">

Но это не работает.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вы также можете использовать Converter

Предполагая:

1) Каждая кнопка имеет префикс Btn

2) изображение имеет толькоодин формат

<Image Source="{Binding RelativeSource={RelativeSource FindAncestor, 
               AncestorType={x:Type Button}},Path=Name,Converter= 
               {StaticResource NameToPathConverter}}"/>

, тогда ваша кнопка будет выглядеть так:

<Button Name="BtnDestinationPin" Style="{StaticResource btnDefaultOperationImage}" />

Определить конвертер как ресурс:

<local:NameToPathConverter x:Key="NameToPathConverter"/>

Код:

public class NameToPathConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string imageName = value.ToString().Substring(3);
        return new BitmapImage(new Uri("pack://application:,,,/YourNamespace;component/Images/" + imageName + ".png"));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
0 голосов
/ 02 июня 2018

Я думаю, вы просите что-то подобное.То, что вам нужно сделать, это bind ваш image source для свойства на каждом button.В этом примере я использовал свойство tag, но вы можете использовать что угодно - attached property, ViewModel property и т. Д.

<Window.Resources>
    <Style x:Key="btnDefaultOperationImage" TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Name="brdMenu"
                    BorderThickness="0"
                    Padding="4,2"
                    BorderBrush="White"
                    Background="#20000000">
                        <StackPanel>
                            <ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center">
                                <ContentPresenter.Resources>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="TextAlignment" Value="Center" />
                                    </Style>
                                </ContentPresenter.Resources>
                            </ContentPresenter>
                            <Image>
                                <Image.Style>
                                    <Style TargetType="{x:Type Image}">
                                        <Setter Property="Source" Value="{Binding Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" />
                                    </Style>
                                </Image.Style>
                            </Image>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="brdMenu" Property="BorderBrush" Value="#F2826A"/>
                            <Setter TargetName="brdMenu" Property="Background" Value="#30000000"/>
                            <Setter TargetName="brdMenu" Property="TextElement.FontSize" Value="25"/>
                            <Setter TargetName="brdMenu" Property="TextElement.Foreground" Value="AntiqueWhite"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="brdMenu" Property="BorderBrush" Value="OrangeRed" />
                            <Setter TargetName="brdMenu" Property="Background" Value="White" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <!--<Setter TargetName="brdMenu" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />-->
                            <Setter TargetName="brdMenu" Property="Background" Value="#f9f9f9" />
                            <Setter TargetName="brdMenu" Property="Opacity" Value="0.3" />
                            <Setter Property="Foreground" Value="Black" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <StackPanel>
        <Button Style="{StaticResource btnDefaultOperationImage}" Tag="..\image1.png"/>
        <Button Style="{StaticResource btnDefaultOperationImage}" Tag="..\image2.png"/>
    </StackPanel>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...