2013-03-20 46 views
0

我为了在所有按钮,在我的项目申请它写在resorces.xaml验证码:书写风格背后的C#

<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#后面的代码写出来?

+1

不要在代码中操作UI元素。如果您需要动态ImageSources,请在您的ViewModel的某处放置一个“public string ImageSource {get; set;}”并将图像绑定到该图像上。 – 2013-03-20 16:05:26

+0

你*真的*不想这样做,除非你绝对被迫;处理WPF UI元素的创建(以及所有相关结构)是一项艰巨而脆弱的任务。 – JerKimball 2013-03-20 16:08:49

+0

@JerKimball你被骗了...当我睡觉时,你在棋盘上移动了2个棋子。当我得到一些时间后,我会继续这样做。 – 2013-03-20 16:19:50

回答

1

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

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

这应该让你开始

虽然像其他人说我觉得你应该去一个视图模型类型的方法,让绑定做到这一点。

虽然另一种方法是劫持一个漂亮的未使用的属性(或者更好的是仍然添加一个附加属性),比如标记,并将其用于图像名称。然后,您可以创建一个ControlTemplate,它可以是您的Style的一部分,它将查找特定的Button(您正在应用Style的那个),以获取Tag,它将成为图像的路径。

因此,像这样:

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

你,你会想使样式的模板部分。但你明白我希望

+0

萨沙,你是我的偶像之一,但我不得不不同意你的看法。即使OP没有别的机会,只能在代码中这样做,首选的方法仍然是使用XAML和XAMLReader,就像[this](http://www.codeproject.com/Articles/444371/Creating-WPF -Data-Templates-in-Code-The-Right-Way) – 2013-03-20 16:13:25

+0

我实际上同意你的看法,我认为XAML方法就是要走的路。然而,因为他问了关于在代码中使用Style,我只是给他指出了一个资源。我认为他应该去MVVM,并有一个迷你虚拟机,其中包含按钮对象的列表。或者使用你的方法,这也很酷 – sacha 2013-03-21 08:10:58