WPF XAML更改某些元素的样式模板属性

时间:2018-03-27 14:55:20

标签: wpf xaml templates binding

在WPF应用程序中,我有一个用于按钮的样式:

<Style TargetType="Button" x:Key="ButtonEllipse">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <StackPanel Orientation="Vertical">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 0 10"/>
                    <Image x:Name="ButtonImage" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Source="/MyProject;component/Images/ButtonEllipse.png"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

对于大多数按钮来说,但是对于一个特定的实例,我想使用相同的模板,但是将图像更改为ButtonEllipseNew.png(这是视图模型属性的值)。按钮的定义如下:

<Button Content="Test" Style="{StaticResource ButtonEllipse}">
</Button>

如何仅为此特定按钮更改模板中图像源的值?我想将源绑定到视图模型中的属性。

3 个答案:

答案 0 :(得分:2)

我担心你不能只重用ControlTemplate的一部分。您必须将模板定义为一个整体:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?

您可以做的是将模板中Source的{​​{1}}属性绑定到某个属性,然后您可以为应用该模板的每个控件单独设置该属性:

Image

答案 1 :(得分:1)

我会编写一个看起来像这样的自定义控件:

SESSION_DOMAIN=.project.com

然后编辑你的风格以适应它:

internal class IconButton : Button
{
    public ImageSource Source
    {
        get { return (ImageSource)GetValue(SourceProperty); }
        set { SetValue(SourceProperty, value); }
    }

    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.Register("Source", typeof(ImageSource), typeof(IconButton), new PropertyMetadata(null));

}

其中location是xaml定义的名称空间,其中放置了IconButton类。

然后只需设置按钮的<Style TargetType="{x:Type location:IconButton}" x:Key="ButtonEllipse"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type location:IconButton}"> <StackPanel Orientation="Vertical"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 0 10"/> <Image x:Name="ButtonImage" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Source="{TemplateBinding Source"/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> 属性即可。您可以使用Source属性来设置默认值。

答案 2 :(得分:0)

要将属性绑定到您的样式,您应该执行以下操作:

创建用户控件,将其命名为ButtonImage.cs

    public class ButtonImage : Button
{
    public ImageSource Source
    {
        get
        {
            return (ImageSource)GetValue(SourceProperty);
        }
        set
        {
            SetValue(SourceProperty, value);
        }
    }

    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.Register("Source", 
            typeof(ImageSource), 
            typeof(ButtonImage), 
            new PropertyMetadata(null));

}

我会创建一个ResourceDictionary,以便您可以将它用于所有样式。我们将其命名为Dictionary.xaml。你可以在那里定义你的风格:

        <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:WpfApplication4">
        <Style TargetType="{x:Type local:ButtonImage}" x:Key="ButtonEllipse">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ButtonImage}">
                        <StackPanel Orientation="Vertical">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 0 10"/>
                            <Image x:Name="ButtonImage" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Source="{TemplateBinding Source}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

然后在您看来,您可以这样做:

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:wpfApplication4="clr-namespace:WpfApplication4"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary 
                  Source="Dictionary.xaml">
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <wpfApplication4:ButtonImage Margin="0,50,0,0" Content="Test" Source="{Binding Name}" Style="{StaticResource ButtonEllipse}" />
    </Grid>
</Window>