WPF自定义控件为空白

时间:2017-06-01 13:44:59

标签: c# wpf xaml

我想创建一个扩展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)));
        }
    }
}

1 个答案:

答案 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>