如何参数化样式?

时间:2011-09-26 11:49:23

标签: c# wpf xaml

我是WPF的新手。我正在尝试做同样的风格。我们的想法是定制按钮样式。所以,例如,我想改变按钮的背景颜色。或按钮的图像。

这是样式的代码

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    x:Class="WPFControlsApp.App"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <!-- Resources scoped at the Application level should be defined here. -->
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Simple Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <ControlTemplate x:Key="CustomButtonStyle" TargetType="{x:Type Button}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="CuandoEstoyArribaDelBoton">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Glow">
                            <EasingColorKeyFrame KeyTime="0" Value="White"/>
                            <EasingColorKeyFrame KeyTime="0:0:0.7" Value="#FF562020"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </ControlTemplate.Resources>
                <Grid>
                    <Rectangle x:Name="Background" Fill="#FF5A98EB" RadiusY="15" RadiusX="15" Stroke="#FF114FA1" StrokeThickness="2"/>
                    <Rectangle x:Name="Glow" Fill="White" RadiusY="15" RadiusX="15" Stroke="{x:Null}" StrokeThickness="0" Margin="0,0,0,49" Opacity="0.215"/>
                    <Rectangle x:Name="Glass" RadiusY="15" RadiusX="15" Stroke="#FF114FA1" StrokeThickness="2" Opacity="0.475">
                        <Rectangle.Fill>
                            <RadialGradientBrush RadiusY="0.62" RadiusX="0.62" GradientOrigin="0.506,1.063">
                                <GradientStop Color="#00000000" Offset="0"/>
                                <GradientStop Color="#FF00084B" Offset="1"/>
                            </RadialGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{Binding MINOMBREBOTON, FallbackValue=MiBoton}"/>
                    <Image HorizontalAlignment="Left" Margin="7,24,0,25" Width="100" Source="{Binding BtnImageSource}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True"/>
                    <Trigger Property="IsDefaulted" Value="True"/>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Trigger.ExitActions>
                            <StopStoryboard BeginStoryboardName="CuandoEstoyArribaDelBoton_BeginStoryboard"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard x:Name="CuandoEstoyArribaDelBoton_BeginStoryboard" Storyboard="{StaticResource CuandoEstoyArribaDelBoton}"/>
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True"/>
                    <Trigger Property="IsEnabled" Value="False"/>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这是我不知道如何解决的问题

<Image HorizontalAlignment="Left" Margin="7,24,0,25" Width="100" Source="{Binding BtnImageSource}"/>

我有一个名为BtnImageSource的绑定。但我不知道如何在按钮定义中设置它。

<Button Content="Salir" Height="102" HorizontalAlignment="Right" Margin="0,0,25,26" Name="btn_salir" VerticalAlignment="Bottom" Width="280" ClipToBounds="False" Click="btn_salir_Click" Style="{StaticResource CustomButtonStyle}" />

你知道我怎么能有3个4个按钮,每个按钮具有相同的风格但不同的图像?

这是对新应用的测试。我们的想法是使用带参数的样式或找到另一种替代方案。

提前致谢。我希望能够清楚。

1 个答案:

答案 0 :(得分:2)

是的,可能...... DynamicResource应该有所帮助。将颜色属性设置为某个DynamicResource(使用资源键)。声明时可能不存在此密钥。然后,当您需要特定颜色时,然后创建该颜色的画笔并声明它相同 Key并与相关资源合并。

E.g。你有这个样式资源,它使用动态颜色画笔DynamicColorBrush设置为按钮的背景......

<App.Resources ...>
 <Style TargetType="{x:Type Button}">
    <Setter Background="{DynamicResource DynamicColorBrush}" />
 </Style>
.... 

请注意,App.Resources未定义DynamicColorBrush。现在假设您在两个不同的视图中定义按钮

<UserControl ... x:Class="UserControl1">
     <UserControl.Resources>
          <SolidColorBrush x:Key="DynamicColorBrush" Color="Red"/>
     </UserControl.Resources>
     <Grid><Button Content="Red Button"/></Grid>
</UserControl> 

<UserControl ... x:Class="UserControl2">
     <UserControl.Resources>
          <SolidColorBrush x:Key="DynamicColorBrush" Color="Green"/>
     </UserControl.Resources>
     <Grid><Button Content="Green Button"/></Grid>
</UserControl>

这应该有用。

允许运行时基础颜色更改的flexi主题的整个概念是使用动态资源概念完成的。