我想创建一个扩展TextBox
的简单自定义控件。
我是通过Add -> New Item... -> Custom Control
创建的,并对自动生成的代码进行了一些更改。我将CustomControl
的基类更改为TextBox
并删除Template
文件中的Theme/Generic.xaml
setter。
但是当我将它添加到MainWindow
并运行时,它是空白的。这是我的最终代码:
档案Theme/Generic.xaml
:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Test">
<Style TargetType="{x:Type local:CustomControl}">
<Setter Property="BorderThickness" Value="10"/>
</Style>
</ResourceDictionary>
档案CustomControl.cs
:
namespace Test
{
public class CustomControl : TextBox
{
static CustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
}
}
}
答案 0 :(得分:1)
里面什么也没有。它需要一个模板。
有两种方法可以做到这一点:首先,最简单的方法是将您的Style
设置为默认的TextBox
样式。这将为您提供默认模板以及默认样式中的所有其他内容。如果您愿意,可以随意添加setter来覆盖继承的setter。
<Style
TargetType="{x:Type local:MyCustomControl}"
BasedOn="{StaticResource {x:Type TextBox}}"
>
<Setter Property="BorderThickness" Value="10"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>
其次,编写自己的模板。如果您发现需要执行默认模板不能为您执行的任何操作,您将以这种方式执行此操作。但要注意,控制行为总是比你天真地假设要复杂得多。这些有时可能是深水。
Here's some documentation about retemplating a TextBox
or a subclass of a TextBox
你需要填写比这更多的属性,但这是一个开始:
<Style
TargetType="{x:Type local:MyCustomControl}"
BasedOn="{StaticResource {x:Type TextBox}}"
>
<Setter Property="BorderThickness" Value="10"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl}">
<Border
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
>
<ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>