从c#后面的代码中写出样式

时间:2013-03-20 16:03:45

标签: c# wpf visual-studio-2012 coding-style resources

我在resorces.xaml中编写了这段代码,以便在我项目的所有按钮中应用它:

 <Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Rectangle x:Name="rect" Style="{DynamicResource rectangle_style}" Cursor="Hand">
                        <Rectangle.Fill>
                            <ImageBrush ImageSource="Attempts\image.jpg" Stretch="UniformToFill"/>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content=""/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True"/>
                    <Trigger Property="IsDefaulted" Value="True"/>
                    <Trigger Property="IsMouseOver" Value="True"/>
                    <Trigger Property="IsPressed" Value="True"/>
                    <Trigger Property="IsEnabled" Value="False"/>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我会从C#后面的代码中编辑这个样式,因为我想要从代码中动态更改imagesource,我怎样才能从C#后面的代码中编写它?

1 个答案:

答案 0 :(得分:1)

虽然我没有时间逐行翻译,但我已经写了一篇关于如何在代码中创建DataTemplates / Styles的完整文章。

http://www.codeproject.com/Articles/29699/WPF-How-to-create-Styles-in-code-and-magical-Conte

这应该让你开始

虽然和其他人一样,我认为你应该采用ViewModel类型的方法并让绑定来做。

另一种方法是劫持一个非常未使用的属性(或者更好的是仍然添加附加属性),例如Tag,并将其用于你的Image名称。然后你可以创建一个ControlTemplate,它可以成为你的Style的一部分,它将在Tag中找到特定的Button(你正在应用Style的那个),它将是一个图像的路径。

这样的事情:

<ControlTemplate x:Key="bordereredButtonTemplateWithMouseAndPropHiJacking" 
            TargetType="{x:Type Button}">
    <Border x:Name="border" CornerRadius="3" 
            Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding Foreground}" 
            BorderThickness="2" Width="auto" 
            Visibility="Visible">
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent},
                 Path=Tag}" Width="20" 
                 Height="20" HorizontalAlignment="Left"
                 Margin="{TemplateBinding Padding}" />
            <ContentPresenter  
                Margin="{TemplateBinding Padding}" 
                Content="{TemplateBinding Content}" 
                Width="auto" Height="auto"/>
        </StackPanel>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter TargetName="border" 
                Property="Opacity" Value="0.4"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter TargetName="border" 
                Property="Background" Value="Orange"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

然后当你想在你的XAML中使用它时,你会做

<Button Template="{StaticResource bordereredButtonTemplateWithMouseAndPropHiJacking}"   
Tag="c:\temp\image1.jpg"/>
<Button Template="{StaticResource bordereredButtonTemplateWithMouseAndPropHiJacking}" 
Tag="c:\temp\image1.jpg"/>

对于你,你会希望将模板作为Style的一部分,但你会得到我希望的想法