2010-06-28 61 views
0

我想你可以得出有足够的经验XAML多prety什么,但我是一个C++的人新的WPF。我需要一个具有渐变颜色和周围特殊边框的按钮。那么我们C++的人呢?我们去找设计师,问一个左侧的垂直图像,中间的一个和一个右侧的图像,然后重写Win32绘图信息,实际上我们自己绘制按钮。我可以完全控制自定义WPF按钮的绘图吗?

什么是这样做的WPF的方式?我是否需要为此掌握XAML,或者我能以某种方式利用这3张图片来组成按钮?我天真的想法是做这样的事情,我是否将按钮分成三部分,每一部分都有不同的背景,但是这并没有给我想要的结果。我可以控制按钮的绘制方式吗?

<Style x:Key="NavButtonStyle" TargetType="{x:Type Button}"> 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid ShowGridLines="False"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 
         <Grid Grid.Column="0"> 
          <Grid.Background> 
           <ImageBrush ImageSource="/Images/left.png"/> 
          </Grid.Background> 
         </Grid> 
         <StackPanel Grid.Column="1" HorizontalAlignment="Center" Orientation="Horizontal"> 
          <StackPanel.Background> 
           <ImageBrush Stretch="Fill" ImageSource="/Images/middle.png"/> 
          </StackPanel.Background> 
          <Image Source="/Images/Icons/myIcon.png"/> 
          <TextBlock Text="myCaption"/> 
         </StackPanel> 
         <Grid Grid.Column="2"> 
          <Grid.Background> 
           <ImageBrush Stretch="Fill" ImageSource="/Images/right.png"/> 
          </Grid.Background> 
         </Grid> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

另一个问题是如何使这个通用模板,以便我可以复制的外观和感觉,但只是改变图标和文本。我想这个任务的正确方法是从Button继承一个CustomControl类?

回答

0

真正简短的回答是,这是你用什么Expression Blend中。

的略少简短的回答是,大部分的你的描述可以通过编辑控制模板,如果你了解控件模板是如何工作的,你知道修改的内容来完成。 Expression Blend是一个很好的工具,因为Blend使得编辑控件的模板变得相对简单,并且因为Blend记得很多你可能会忘记的东西,特别是当你对WPF比较陌生的时候。

举例来说,如果我进入混合,画在画板上的按钮,并编辑其控制模板的副本,这里就是我得到之前,我甚至开始与任何搞乱:

<Style x:Key="ButtonFocusVisual"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="2" SnapsToDevicePixels="true"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0"> 
    <GradientStop Color="#F3F3F3" Offset="0"/> 
    <GradientStop Color="#EBEBEB" Offset="0.5"/> 
    <GradientStop Color="#DDDDDD" Offset="0.5"/> 
    <GradientStop Color="#CDCDCD" Offset="1"/> 
</LinearGradientBrush> 
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/> 
<Style x:Key="ButtonControlTemplate" TargetType="{x:Type Button}"> 
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> 
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> 
    <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="HorizontalContentAlignment" Value="Center"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="Padding" Value="1"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/> 
     </Microsoft_Windows_Themes:ButtonChrome> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsKeyboardFocused" Value="true"> 
      <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/> 
      </Trigger> 
      <Trigger Property="ToggleButton.IsChecked" Value="true"> 
      <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="#ADADAD"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

原则,所有你需要做的就是找到ContentPresenter元素(这是按钮内容被插入的地方),并用你自己的漂亮东西替换它所包围的内容。您可以将该XAML复制到您自己的项目中,并将其混淆,然后您将获得某些作品。

但:有没有在那里,你需要了解之前,你会最终产生一个按钮,其实你想要做什么了很多东西。它的大部分代表了功能和行为,如果你有像我这样的聪明点子开发自己的按钮,那么你就没有烦恼自己想想。像:

  • 按钮的外观如何改变焦点?
  • 按钮的外观在禁用时应如何更改?
  • 什么事件应该改变按钮的视觉外观?

你会注意到,如果你看这个模板,那么最后一个问题的很多答案都嵌入在Microsoft_Windows_Themes:ButtonChrome元素中。它在代码中执行的所有操作(例如RenderPressed)都是您必须通过触发器构建到XAML中的东西。 (或者你可以编写自己的按钮 - 类似铬的物体。)

我想我说的是你没有错误的轨道,但有很多你需要学习。

至于你的第二个问题,是的,你可以创建一个UserControl并公开属性的标题和图像。您也可以尝试一点,因为该按钮实际上是一个内容控件,例如:

<Button Height=50> 
    <DockPanel> 
    <Image Width="32" Source="image.png"/> 
    <TextBlock Text="My button's caption" TextWrapping="Wrap" VerticalAlignment="Center"/> 
    </DockPanel> 
</Button> 
+0

感谢Robert给出了详细的答案 - 它确实有帮助。 – user350213 2010-06-28 18:12:37

0

1#: 我不知道你是什么让控制按钮是什么意思?但是我们可以控制自己喜欢的按钮风格。在上面的XAML中,我只看到了模板,但没有触发器或VisualState提及按钮的不同状态/行为/效果,如鼠标悬停,鼠标离开,按钮按下等。由于此控件覆盖默认样式,这些效果将表现为默认按钮。

2#:由于这是一个自定义的控制,你可以在“主题”文件夹& generic.xaml添加的样式。你不应该指定密钥名称,那么它将被应用到下面所有customcontrol按钮:

<Style TargetType="{x:Type custom:CustomerControlType}"> 
相关问题