2015-06-08 108 views
3

我尝试在WPF编辑风格是这样的:WPF:自定义按钮

enter image description here

,其允许用户设计,这样

enter image description here

,但是当我尝试创建我的自己的风格有铬层不是模板,我不能创建我自己的按钮,我只能修改像刷子一样简单的值,......

enter image description here

+3

说实话,如果你从一个教程开始,比如[this](http://www.blackwasp.co.uk/WPFControlTemplates.aspx),那将是一个更好的主意。如果您让Blend在您的应用程序中加载一段代码,您不会学到太多东西。只是我的两分钱。 –

+1

我同意@MikeEason:这个问题看起来更像是对在线辅导和代码写作服务的请求。最好的问候, –

回答

2

米拉德只是去除铬层和在模板中包括边界(写你自己的鼠标悬停触发器和点击):

<Border x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 

触发器:中

<ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="true"> 
           <Setter Property="Background" TargetName="Chrome" Value="Blue"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="#ADADAD"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
+0

为什么有铬,在旧版本的混合(v <13)没有镀铬 – Milad

+1

米拉德,铬是他们用于风格的类是presentationframework。它有更多的属性作为RenderPressed等 – ReeganLourduraj

1

非常详细规范的例子在Micrsoft MSDN(https://msdn.microsoft.com/en-us/library/ms753328%28v=vs.110%29.aspx)中提供了WPF Button通过XAML控制样式:

XAML

<Style x:Key="ButtonFocusVisual"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <Border> 
      <Rectangle Margin="2" 
        StrokeThickness="1" 
        Stroke="#60000000" 
        StrokeDashArray="1 2" /> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<!-- Button --> 
<Style TargetType="Button"> 
    <Setter Property="SnapsToDevicePixels" 
      Value="true" /> 
    <Setter Property="OverridesDefaultStyle" 
      Value="true" /> 
    <Setter Property="FocusVisualStyle" 
      Value="{StaticResource ButtonFocusVisual}" /> 
    <Setter Property="MinHeight" 
      Value="23" /> 
    <Setter Property="MinWidth" 
      Value="75" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <Border TextBlock.Foreground="{TemplateBinding Foreground}" 
       x:Name="Border" 
       CornerRadius="2" 
       BorderThickness="1"> 
      <Border.BorderBrush> 
      <LinearGradientBrush StartPoint="0,0" 
           EndPoint="0,1"> 
       <LinearGradientBrush.GradientStops> 
       <GradientStopCollection> 
        <GradientStop Color="{DynamicResource BorderLightColor}" 
           Offset="0.0" /> 
        <GradientStop Color="{DynamicResource BorderDarkColor}" 
           Offset="1.0" /> 
       </GradientStopCollection> 
       </LinearGradientBrush.GradientStops> 
      </LinearGradientBrush> 

      </Border.BorderBrush> 
      <Border.Background> 
      <LinearGradientBrush EndPoint="0.5,1" 
           StartPoint="0.5,0"> 
       <GradientStop Color="{DynamicResource ControlLightColor}" 
          Offset="0" /> 
       <GradientStop Color="{DynamicResource ControlMediumColor}" 
          Offset="1" /> 
      </LinearGradientBrush> 
      </Border.Background> 
      <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
       <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0:0:0.5" /> 
       <VisualTransition GeneratedDuration="0" 
            To="Pressed" /> 
       </VisualStateGroup.Transitions> 
       <VisualState x:Name="Normal" /> 
       <VisualState x:Name="MouseOver"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource ControlMouseOverColor}" /> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Pressed"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource ControlPressedColor}" /> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush). 
         (GradientBrush.GradientStops)[0].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource PressedBorderDarkColor}" /> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource PressedBorderLightColor}" /> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Disabled"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource DisabledControlDarkColor}" /> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames 
         Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource DisabledForegroundColor}" /> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource DisabledBorderDarkColor}" /> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <ContentPresenter Margin="2" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" 
          RecognizesAccessKey="True" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsDefault" 
        Value="true"> 

      <Setter TargetName="Border" 
        Property="BorderBrush"> 
       <Setter.Value> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="0,1"> 
        <GradientBrush.GradientStops> 
        <GradientStopCollection> 
         <GradientStop Color="{DynamicResource DefaultBorderBrushLightBrush}" 
            Offset="0.0" /> 
         <GradientStop Color="{DynamicResource DefaultBorderBrushDarkColor}" 
            Offset="1.0" /> 
        </GradientStopCollection> 
        </GradientBrush.GradientStops> 
       </LinearGradientBrush> 

       </Setter.Value> 
      </Setter> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

资源

<!--Control colors.--> 
<Color x:Key="WindowColor">#FFE8EDF9</Color> 
<Color x:Key="ContentAreaColorLight">#FFC5CBF9</Color> 
<Color x:Key="ContentAreaColorDark">#FF7381F9</Color> 

<Color x:Key="DisabledControlLightColor">#FFE8EDF9</Color> 
<Color x:Key="DisabledControlDarkColor">#FFC5CBF9</Color> 
<Color x:Key="DisabledForegroundColor">#FF888888</Color> 

<Color x:Key="SelectedBackgroundColor">#FFC5CBF9</Color> 
<Color x:Key="SelectedUnfocusedColor">#FFDDDDDD</Color> 

<Color x:Key="ControlLightColor">White</Color> 
<Color x:Key="ControlMediumColor">#FF7381F9</Color> 
<Color x:Key="ControlDarkColor">#FF211AA9</Color> 

<Color x:Key="ControlMouseOverColor">#FF3843C4</Color> 
<Color x:Key="ControlPressedColor">#FF211AA9</Color> 


<Color x:Key="GlyphColor">#FF444444</Color> 
<Color x:Key="GlyphMouseOver">sc#1, 0.004391443, 0.002428215, 0.242281124</Color> 

<!--Border colors--> 
<Color x:Key="BorderLightColor">#FFCCCCCC</Color> 
<Color x:Key="BorderMediumColor">#FF888888</Color> 
<Color x:Key="BorderDarkColor">#FF444444</Color> 

<Color x:Key="PressedBorderLightColor">#FF888888</Color> 
<Color x:Key="PressedBorderDarkColor">#FF444444</Color> 

<Color x:Key="DisabledBorderLightColor">#FFAAAAAA</Color> 
<Color x:Key="DisabledBorderDarkColor">#FF888888</Color> 

<Color x:Key="DefaultBorderBrushDarkColor">Black</Color> 

<!--Control-specific resources.--> 
<Color x:Key="HeaderTopColor">#FFC5CBF9</Color> 
<Color x:Key="DatagridCurrentCellBorderColor">Black</Color> 
<Color x:Key="SliderTrackDarkColor">#FFC5CBF9</Color> 

<Color x:Key="NavButtonFrameColor">#FF3843C4</Color> 

<LinearGradientBrush x:Key="MenuPopupBrush" 
        EndPoint="0.5,1" 
        StartPoint="0.5,0"> 
    <GradientStop Color="{DynamicResource ControlLightColor}" 
       Offset="0" /> 
    <GradientStop Color="{DynamicResource ControlMediumColor}" 
       Offset="0.5" /> 
    <GradientStop Color="{DynamicResource ControlLightColor}" 
       Offset="1" /> 
</LinearGradientBrush> 

<LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" 
        StartPoint="0,0" 
        EndPoint="1,0"> 
    <LinearGradientBrush.GradientStops> 
    <GradientStopCollection> 
     <GradientStop Color="#000000FF" 
        Offset="0" /> 
     <GradientStop Color="#600000FF" 
        Offset="0.4" /> 
     <GradientStop Color="#600000FF" 
        Offset="0.6" /> 
     <GradientStop Color="#000000FF" 
        Offset="1" /> 
    </GradientStopCollection> 
    </LinearGradientBrush.GradientStops> 
</LinearGradientBrush> 

希望这有助于。

+0

您的链接是其他风格的门太多,谢谢! – Milad

+1

欢迎您!当然,您也可以将这种造型技术应用于其他控件。这种高级XAML样式是在实际的WPF应用程序中完成的:这里是一个链接到带有大量WPF示例应用程序(免费下载)的网站:http://infosoft.biz/download.aspx。祝你的项目好运。最好的祝福, –