在自定义控件中放置样式

问题描述:

我正在创建自定义控件。并突然面临一个问题:为什么把控制的风格与控制分开? 我的意思是说,使用标准的方法,您必须:从基本控件派生(例如,从TextBox)并在general.xaml中为其添加样式。 但为什么我们不能做的就像这样:在自定义控件中放置样式

<TextBox x:Class="CustomTest.CoolTextBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <TextBox.Style> 
     <Style> 
      <Setter Property="TextBox.FontSize" Value="20" /> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

和代码隐藏:

public partial class CoolTextBox : TextBox 
{ 
    public CoolTextBox() 
    { 
     InitializeComponent(); 
    } 
} 

更新#1

我不写我自己的库,但创建我的主要可执行文件中的自定义控件应用程序支持主题,但它们只有颜色不同。所以每个主题都是一组画笔资源,我的风格将使用DynamicResource来引用它们。

我想知道的是该解决方案的缺点。我的意思是性能,使用简单等。

WPF允许在运行时更改主题,意味着样式应与控件分开存储。而且,当为其他程序员设计自己的自定义样式时,控件应该是无形的,尽管应该有一个默认样式,必须将其独立地存储在Generic.xaml文件中。如果您的应用不支持更改主题,那么您可以根据需要定义样式。

如果您正在编写自定义控件库,我建议您坚持标准。

这里是一个链接,如何将一个自定义的控件创建:

http://wpftutorial.net/HowToCreateACustomControl.html

+0

感谢您的回答!请参阅更新#1 –

+0

DynamicResources比StaticResources慢并且应该避免。 –

+0

同意!但在目前的项目中并没有太多的控制措施,而且这种放缓是无形的。 –

除了开发刺猬的回答关于性能,我发现以下缺点:

  1. Style对象对于每个控制的实例都是自己的。所以你最终得到的是相同Style对象的克隆数量。
  2. 您无法使用BasedOn属性重写样式。只有完全更换是可能的。