1

我试图在 Windows 8 XAML 中创建自定义文本框控件。

我已经右键单击我的项目 -> 添加 -> 新项目

然后我选择了模板化控件并输入了名称 MyTextBox

然后我让这个类派生自 TextBox 并添加了一个名为 Hello 的测试方法。所以它现在看起来像这样:

public sealed class MyTextBox : TextBox
{
    public MyTextBox()
    {
        this.DefaultStyleKey = typeof(MyTextBox);
    }

    public void Hello()
    {
        //Do something here!
    }
}

在我的项目中,还添加了一个名为 Generic.xaml 的文件,其样式如下:

<Style TargetType="local:MyTextBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyTextBox">
                <Border
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

所以在这里我尝试使用 Style 标签添加 BasedOn="TextBox" :

<Style TargetType="local:WatermarkTextBox" BasedOn="TextBox">

这行不通。

我需要做什么来创建这个自定义文本框,然后我如何在我的 XAML 中使用它

这适用于 Windows RT,因此 XAML 可能与 WPF 不同。

4

2 回答 2

2

最好的文章之一,也是我最喜欢的:为 XAML Metro 风格应用构建可部署的自定义控件

这是 MSDN 示例应用程序:XAML 用户和自定义控件示例

更新 1:

<Style TargetType="local:WatermarkTextBox" BasedOn="TextBox">

您不必指定BasedOn属性。如果您正在开发水印文本框,那么我建议您检查 Callisto 的水印文本框代码。

通用的.xaml

水印文本框.cs

于 2013-04-10T13:58:44.893 回答
0

BasedOn 值可以通过 StaticResources 来指向,例如BasedOn={StaticResource DefaultTextBoxStyle}

我有一个 NumericOnlyTextBox 实现。我没有将其设为 BasedOn 文本框,而是添加了一个文本框及其所有依赖项。

例如:

<Style TargetType="local:NumericOnlyTextBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:NumericOnlyTextBox">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>
                        <TextBox x:Name="TextBoxPart"
                             Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=EnteredText, Mode=TwoWay}"
                             MaxLength="{TemplateBinding MaxLength}">
                        </TextBox>                            
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="IsTabStop" Value="False"></Setter>
</Style>
于 2013-04-10T13:57:58.363 回答