我可以完全控制自定义WPF按钮的绘图吗? 我想你可以用足够多的XAML经验来绘制很多东西,但是我是一个新的WPF的C++新手。我需要一个按钮,有一个梯度颜色加上一个特殊的边界周围。那么我们C++的人做什么呢?我们去设计器,要求一个左垂直图像,中间一个和右一个,然后覆盖Win32绘图消息,实际上是自己绘制按钮
WPF是如何做到这一点的?我需要掌握XAML吗,或者我可以利用这3张图片来制作一个按钮吗?我天真的想法是这样做的,我把按钮分成3个部分,每个部分都有不同的背景,但这并没有给我想要的结果。我可以控制按钮的绘制方式吗我可以完全控制自定义WPF按钮的绘图吗? 我想你可以用足够多的XAML经验来绘制很多东西,但是我是一个新的WPF的C++新手。我需要一个按钮,有一个梯度颜色加上一个特殊的边界周围。那么我们C++的人做什么呢?我们去设计器,要求一个左垂直图像,中间一个和右一个,然后覆盖Win32绘图消息,实际上是自己绘制按钮,wpf,button,Wpf,Button,WPF是如何做到这一点的?我需要掌握XAML吗,或者我可以利用这3张图片来制作一个按钮吗?我天真的想法是这样做的,我把按钮分成3个部分,每个部分都有不同的背景,但这并没有给我想要的结果。我可以控制按钮的绘制方式吗 <Style x:Key="NavButtonStyle" TargetType="{x:Type Button}"> <Setter Property="OverridesDefaultStyle" Value="True" />
<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?1#继承一个CustomControl类:
我不知道你们控制按钮是什么意思?但是我们可以控制你喜欢的按钮样式。在上面的XAML中,我只看到了模板,但没有触发器或可视状态来提及按钮的不同状态/行为/效果,如鼠标悬停、鼠标离开、按钮按下等。。由于此控件覆盖默认样式,因此这些效果将作为默认按钮
2#:由于这是一个自定义控件,因此可以在“Themes”文件夹&generic.xaml下添加样式。您不应指定键名,然后它将应用于所有customcontrol按钮,如下所示:
<Style TargetType="{x:Type custom:CustomerControlType}">
真正简短的答案是,这就是您使用Expression Blend的目的 简短的回答是,如果您了解控件模板的工作方式,并且知道要编辑什么,那么您描述的大部分内容都可以通过编辑控件模板来完成。Expression Blend是一个很好的工具,因为Blend使编辑控件的模板相对容易,并且因为Blend记住了很多您可能会忘记的事情,特别是如果您对WPF比较陌生的话 例如,如果我进入Blend,在artboard上绘制一个按钮,并编辑其控件模板的副本,在我开始处理任何事情之前,我会得到以下结果:
<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>
谢谢罗伯特详细的回答,这确实有帮助。
<Button Height=50>
<DockPanel>
<Image Width="32" Source="image.png"/>
<TextBlock Text="My button's caption" TextWrapping="Wrap" VerticalAlignment="Center"/>
</DockPanel>
</Button>