我在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#后面的代码中编写它?
答案 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的一部分,但你会得到我希望的想法