1 新建wpf项目
2 新建wpf用户控件库
3 添加普通类,让其继承于Control类,添加两个依赖属性Text和IsEnable,并在静态构造函数中,调用DefaultStyleKeyProperty.OverrideMetadata方法
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace CustomControls
{
public class MyNoViewControl:Control
{
static MyNoViewControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyNoViewControl), new FrameworkPropertyMetadata(typeof(MyNoViewControl)));
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MyNoViewControl), new PropertyMetadata(""));
public bool IsEnable
{
get { return (bool)GetValue(IsEnableProperty); }
set { SetValue(IsEnableProperty, value); }
}
public static readonly DependencyProperty IsEnableProperty =
DependencyProperty.Register("IsEnable", typeof(bool), typeof(MyNoViewControl), new PropertyMetadata(false));
}
}
4 在MainWindow里面引用库,并修改代码,设定属性,并指定控件模板,可以实现定制外观
<Window x:Class="CustomControlDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CustomControlDemo"
mc:Ignorable="d"
xmlns:lib="clr-namespace:CustomControls;assembly=CustomControls"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<ResourceDictionary>
<ControlTemplate x:Key="MyNoViewControlNoramlTemplate" TargetType="{x:Type lib:MyNoViewControl}">
<StackPanel>
<TextBlock Text="{TemplateBinding Text}"/>
<Button Content="{TemplateBinding Text}" IsEnabled="{TemplateBinding IsEnable}"/>
</StackPanel>
</ControlTemplate>
<ControlTemplate x:Key="MyNoViewControlFlipTemplate" TargetType="{x:Type lib:MyNoViewControl}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{TemplateBinding Text}"/>
<Button Content="{TemplateBinding Text}" IsEnabled="{TemplateBinding IsEnable}"/>
</StackPanel>
</ControlTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<lib:MyNoViewControl Text="hello" IsEnable="False" Template="{StaticResource MyNoViewControlFlipTemplate }"/>
<!--<lib:MyNoViewControl Text="hello" IsEnable="False" Template="{StaticResource MyNoViewControlNoramlTemplate }"/>-->
</Grid>
</Window>