Изменить предопределенный стиль внутри элемента управления в xaml - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий стиль в App.xaml:

        <Style TargetType="{x:Type Button}">

            <Style.Resources>
                <DataTemplate x:Key="Unpressed">
                    <Image Stretch="Uniform"  Source="Img/button1.png"/>
                </DataTemplate>
                <DataTemplate x:Key="Pressed">
                    <Image Stretch="Uniform" Source="Img/button1_press.png"/>
                </DataTemplate>
            </Style.Resources>

            <Setter Property="ContentTemplate" Value="{StaticResource Unpressed}"/>

            <Style.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource Pressed}"/>
                </Trigger>
            </Style.Triggers>

        </Style>

Я хочу изменить шаблон данных с моей кнопки, примерно так:

                    <Button x:Name="Button2">

                    <Style>
                        <Style.Resources>
                            <DataTemplate x:Key="Unpressed">
                                <Image Stretch="Uniform" Source="../Img/button2.png"/>
                            </DataTemplate>
                            <DataTemplate x:Key="Pressed">
                                <Image Stretch="Uniform" Source="../Img/button2_press.png"/>
                            </DataTemplate>
                        </Style.Resources>
                    </Style>

                </Button>

Таким образом, в основном все мои кнопки имеют одинаковый стиль, но каждая кнопка имеет уникальное изображение, мне нужно изменить шаблон данных стиля отдельно для каждой кнопки

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Это мое предлагаемое решение:

Для стиля:

<Application.Resources>

    <local:ImgToDisplayConverter x:Key="ImgToDisplayConverter"/>
    <local:ImgPressedToDisplayConverter x:Key="ImgPressedToDisplayConverter"/>

    <Style TargetType="Image" x:Key="PressedButtonImageStyle">
        <Setter Property="Source">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ImgToDisplayConverter}">
                    <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="true">
                <Setter Property="Source">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource ImgPressedToDisplayConverter}">
                            <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

</Application.Resources>

Для контроля:

    <Button Tag="button1"  Width="100" Height="100" HorizontalAlignment="Left">
        <ContentControl>
            <Image Stretch="Uniform" Style="{StaticResource PressedButtonImageStyle}" IsHitTestVisible="False"/>
        </ContentControl>
    </Button>

Конвертеры:

 class ImgToDisplayConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string image = values[0].ToString();
        string resourceName = String.Format("pack://application:,,,/{0}.png", image);

        return new BitmapImage(new Uri(resourceName));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

class ImgPressedToDisplayConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string image = values[0].ToString();
        string resourceName = String.Format("pack://application:,,,/{0}_pressed.png", image);

        return new BitmapImage(new Uri(resourceName));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Вы можете изменить код в зависимости от ваших потребностей.

0 голосов
/ 11 июля 2019

Я использую этот простой код, и он хорошо работает (если вы хотите отпустить кнопку от нажатия, установите таймер). Надеюсь, это поможет вам ..

код xaml

 <Button  Name="male"   Height="318" Width="352"   Click="male_Click" Margin="236,120,1332,642">
            <Button.Background>
                <ImageBrush ImageSource="pack://application:,,,/Imagesrc/logotype/USER_MALE.png" ></ImageBrush>
            </Button.Background>
        </Button>

нажата код

public void male_Click(object sender, RoutedEventArgs e)
        {


            System.Windows.Controls.Image img = new System.Windows.Controls.Image();
            img.Source = new BitmapImage(new Uri(@"pack://application:,,,/maindocket;component/Imagesrc/logotype/USER_MALE_SELECTED.png"));
            male.Content = img;
}
...