2017-08-27 74 views
-2

我之前为自定义控件创建了一些自定义绑定,但由于此例是针对按钮的window.resources样式的,(而非控件模板),我不知道后面的代码从哪里开始。我将在哪里创建视图模型,以及它会继承或引用它?为window.resources风格创建自定义绑定属性

XAML:

<Style x:Key="UnifiedButtonStyle" TargetType="{x:Type Button}"> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="Margin" Value="{Binding Margin}"/> 

     <Setter Property="Background" Value="#FFDDDDDD"/> 
     <Setter Property="BorderBrush" Value="#FF707070"/> 
     <Setter Property="Foreground" Value="#FF000000"/> 

     <Setter Property="BorderThickness" Value="1"/> 

     <Setter Property="Content" Value="Button"/> 

     <Setter Property="Width" Value="75"/> 
     <Setter Property="Height" Value="20"/> 
     <Setter Property="Padding" Value="5"/> 

     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 

     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid 
         x:Name="ButtonGrid" 
         Background="{TemplateBinding Background}" 
         OpacityMask="{TemplateBinding OpacityMask}"> 
         <Border 
          x:Name="ButtonBorder" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          OpacityMask="{TemplateBinding OpacityMask}" 

          BorderThickness="{TemplateBinding BorderThickness}"> 

          <Label 
           x:Name="ButtonLabel" 
           Foreground="{TemplateBinding Foreground}" 

           Padding="{TemplateBinding Padding}"> 
           <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
          </Label> 
         </Border> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="ButtonGrid" Property="Background" Value="{Binding HoverColorBackground}"/> 
          <Setter TargetName="ButtonBorder" Property="BorderBrush" Value="{Binding HoverColorBorder}"/> 
          <Setter TargetName="ButtonLabel" Property="Foreground" Value="{Binding HoverColorForeground}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Hovercolor制定者在这里

回答

2

关键创建一个视图模型定制WPF按钮的颜色是一种错误的做法。按钮颜色方案是严格属于视图的东西。还有许多按钮意味着许多视图模型实例,因为每个按钮可能都希望是唯一的 - 对于如此简单的设置来说,代码太多。

Button类没有足够的依赖项属性来设置表示HoverColorBackground/HoverColorBorder/HoverColorForeground的颜色。替代方法是创建一个派生的Button类(当DP是一些复杂类型和/或具有关联的逻辑时,要走的路)或使用附加属性。我写过a tip, which coveres the second approach

短版

创建一个连接DP

public static class Alt 
{ 
    #region Background 
    public static readonly DependencyProperty BackgroundProperty = 
       DependencyProperty.RegisterAttached("Background", typeof(Brush), 
       typeof(Alt), new PropertyMetadata(null)); 

    public static Brush GetBackground(DependencyObject obj) 
    { 
     return (Brush)obj.GetValue(Alt.BackgroundProperty); 
    } 

    public static void SetBackground(DependencyObject obj, Brush value) 
    { 
     obj.SetValue(Alt.BackgroundProperty, value); 
    } 
    #endregion 
} 

组自定义值,物业

<Button Content="Blue" Foreground="White" Margin="5" 
     Background="Blue" ui:Alt.Background="DarkBlue"/> 

确保模板知道如何使用该属性

<Trigger Property="IsMouseOver" Value="True"> 
    <Setter TargetName="ButtonGrid" 
      Property="Background" 
      Value="{Binding Path=(ui:Alt.Background), 
          RelativeSource={RelativeSource TemplatedParent}}"/> 
</Trigger> 

任何控制工程。许多DP可以以任意组合混合。

+0

我试过你的方法,但是每当我在datacontext中设置其中一个属性时,就会抛出一个stackoverflowexception。我没有丝毫的线索为什么。当属性没有设置,但只是简单的默认datacontext,它不会抛出错误,我没有看到任何递归循环 – Varscott11

+0

编辑:Nevermind上述评论。我忘了给主类添加一个静态导致错误,你猜它是个例外。像这个答案很多。 – Varscott11