简单来说,如何将控件模板添加到我的WPF应用程序?我正在使用带有 .net 4 的 Visual Studio 2010。
以下是几个问题。
1)根据我的理解,自定义模板是用于重新定义控件的已定义的默认设置的东西。在这种情况下,我是对的吗?
2)如果我们希望每当我从工具箱拖放时按钮都带有图像,那么我应该在某处覆盖按钮的 XAML 代码。
例如,我在下面有一个控件模板代码,它重新定义了进度条应该如何
[1. 堆栈溢出的简单示例] WPF 进度条样式
<ControlTemplate x:Key="CustomProgressBar" TargetType="ProgressBar" >
<Grid Name="TemplateRoot" SnapsToDevicePixels="True">
<Rectangle RadiusX="2" RadiusY="2" Fill="Transparent" />
<Border CornerRadius="0,0,0,0" Margin="1,1,1,1">
<Border.Background>
<SolidColorBrush Color="Transparent"/>
</Border.Background>
</Border>
<Border BorderThickness="0,0,0,0" BorderBrush="Transparent" Margin="1,1,1,1">
<Border.Background>
<SolidColorBrush Color="Transparent"/>
</Border.Background>
</Border>
<Rectangle Name="PART_Track" Margin="1,1,1,1" />
<Decorator Name="PART_Indicator" Margin="1,1,1,1" HorizontalAlignment="Left">
<Grid Name="Foreground">
<Rectangle Fill="Transparent" Name="Indicator" />
<Grid Name="Animation" ClipToBounds="True">
<Border Name="PART_GlowRect" Width="100" Margin="0,0,0,0" HorizontalAlignment="Left" Background="LightBlue"/>
</Grid>
<Grid Name="Overlay">
</Grid>
</Grid>
</Decorator>
<Border BorderThickness="0" CornerRadius="0,0,0,0" BorderBrush="Transparent" />
</Grid>
</ControlTemplate>
另外,我尝试创建自定义控件。项目->New->自定义控件和 VS-2010 生成两个文件自定义控件.cs和自定义控件设计器.cs。之后我该怎么办?(假设我需要一个带有图像的按钮,因此总是)。
谢谢。
(1) 控件模板
来自 MSDN(来源):
"控件模板允许您指定控制。控件作者可以定义默认的控件模板和应用程序作者可以重写控件模板以重建控件的视觉结构。
可以自己在 xaml 中创建控件模板,也可以使用表达式混合创建副本以编辑和覆盖现有模板。
(2) 按钮模板
按钮的默认控件模板如下所示:
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ToolBarButtonHoverBorder}"/>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ToolBarButtonHoverBorder}"/>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ToolBarButtonPressedBorder}"/>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource ToolBarButtonPressed}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
要更改它以显示不同的内容,您需要在边框/演示者标签附近添加/更改项目。 图像不支持直接内容,因此您将无法编写:
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<Image Source="/project;component/Images/image.png">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Image>
</Border>
(3) 创建一个控件,其中包含一个包含图像的按钮
为此,您可以创建一个UserControl
并添加一个带有图像的按钮,如下所示:
<UserControl x:Class="ImageButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Button >
<Image Source="/project;component/Images/image.png"></Image>
</Button>
</Grid>
</UserControl>
这将创建一个控件,其中包含可从工具箱中拖动的图像。 显然,图像源是一个静态值,但您可以在代码中更改它,向类传递路径参数,或创建属性来访问它。