声明自定义控件

Declaring custom controls

我将使用一组控件,每个控件都包含一个标签和一个文本框。声明一个自定义控件以便将标签的标题和文本框的输入区域封装为一个是个好主意吗?

我可能可以在 C# 中继承和创建一些东西,但这里的重点是在 XAML 上变得更好所以声明这样一个东西的方法(不确定它是否被称为资源、模板、样式或其他任何东西) 的标记是首选(如果还不需要)。

目前,我采用了以下方法,但我不确定我以后是否会为自己制造更多的麻烦。

<StackPanel Grid.Row="0" Grid.Column="0">
  <Label Content="Boom" Style="{StaticResource DefaultInputStyle}" />
  <DatePicker Style="{StaticResource DefaultInputStyle}" />
</StackPanel>

最好的想法是能够使用这样的东西。

目前,我采用了以下方法,但我不确定我以后是否会为自己制造更多的麻烦。

<MyCoolControl Grid.Row="0" Grid.Column="0"
               Content="Boom"
               Style="{StaticResource DefaultInputStyle}" />

我不确定您是否可以同时为 Label 和 DatePicker 设置 DefaultInputStyle。 DefaultInputStyle 的 TargetType 是什么?如果您将在多个应用程序中使用此自定义控件,建议使用自定义控件。如果要创建自定义控件,则需要从控件继承,创建一些依赖属性,覆盖 DefaultStyleKeyProperty。

public class MyCoolControl : Control
{
  public Style LabeStyle
  {
    get { return (Style)GetValue(LabeStyleProperty); }
    set { SetValue(LabeStyleProperty, value); }
  }

  public static readonly DependencyProperty LabeStyleProperty =
    DependencyProperty.Register(
      "LabeStyle", typeof(Style), typeof(MyCoolControl));

  public Style DatePickerStyle
  {
    get { return (Style)GetValue(DatePickerStyleProperty); }
    set { SetValue(DatePickerStyleProperty, value); }
  }

  public static readonly DependencyProperty DatePickerStyleProperty =
    DependencyProperty.Register(
      "DatePickerStyle", typeof(Style), typeof(MyCoolControl));

  public object LabelContent
  {
    get { return (object)GetValue(LabelContentProperty); }
    set { SetValue(LabelContentProperty, value); }
  }

  public static readonly DependencyProperty LabelContentProperty =
    DependencyProperty.Register(
      "LabelContent", typeof(object), 
      typeof(MyCoolControl), new PropertyMetadata(null));

  static MyCoolControl()
  {
    DefaultStyleKeyProperty.OverrideMetadata(
      typeof(MyCoolControl), 
      new FrameworkPropertyMetadata(typeof(MyCoolControl)));
  }
}

在 Themes/Generic 中为 MyCoolControl 定义隐式样式。xaml:

<Style TargetType="local:MyCoolControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel>
                    <Label Content="{TemplateBinding LabelContent}" Style="{TemplateBinding LabeStyle}" />
                    <DatePicker Style="{TemplateBinding DatePickerStyle}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后你就可以使用自定义控件了:

<local:MyCoolControl Grid.Row="0" Grid.Column="0"
           LabelContent="Boom" DatePickerStyle="{StaticResource DefaultInputDatePickerStyle}"
           LabelStyle="{StaticResource DefaultInputLabelStyle}" />