在 xaml 中更改控件内的预定义样式

Change predefined style inside a control in xaml

我在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>

所以基本上,我所有的按钮都具有相同的样式,但每个按钮都有一个独特的图像,我需要为每个按钮单独更改样式的 DataTemplate

我使用这个简单的代码并且效果很好(如果你想释放按钮被按下,设置定时器)。我希望这对你有帮助..

xaml code

 <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>

pressed code

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;
}

这是我提出的解决方案:

风格:

<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();
    }
}

您可以根据需要更改代码。