0

我已经在 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# 后面的代码中编辑这种样式,因为我想从代码中动态更改图像源,我如何从 C# 后面的代码中编写它?

4

1 回答 1

1

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

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

这应该让你开始

尽管像其他人所说的那样,我认为您应该采用 ViewModel 类型的方法并让绑定来完成。

不过,另一种方法是劫持一个非常未使用的属性(或者最好还是添加一个附加属性),例如标签,并将其用作您的图像名称。然后,您可以创建一个 ControlTemplate,它可以成为您的样式的一部分,它将在特定按钮(您正在应用样式的按钮)中查找将成为图像路径的标签。

所以是这样的:

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

对你来说,你会想让模板成为样式的一部分,但你明白我希望的想法

于 2013-03-20T16:08:22.400 回答