如何在自定义模板中使用自定义属性

本文关键字:自定义属性 自定义 | 更新日期: 2023-09-27 18:11:20

假设我们想创建一个自定义按钮,左侧有一个小椭圆。我想让这个椭圆的颜色是数据可绑定的。

所以我启动混合,并在表面和Edit a Copy of the Template上放一个按钮。现在我有了我的自定义模板,我在里面添加了一个小的Ellipse:

<Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="White" CornerRadius="3">
  <Grid Background="{TemplateBinding Background}" Margin="1">
    <snip   />
    <!-- My ellipse here -->
    <Ellipse x:Name="ellipse" Width="10" Height="10" HorizontalAlignment="Left" />
  </Grid>
</Border>

右键单击此按钮,选择名为MyButtonMake into UserControl。在这个按钮后面的代码中,我添加了一个自定义的dependency property for the画笔':

public Brush MyColor
{
  get { return (Brush)GetValue(MyColorProperty); }
  set { SetValue(MyColorProperty, value); }
}
public static readonly DependencyProperty MyColorProperty = DependencyProperty.Register("MyColor", typeof(Brush), typeof(MyButton), new PropertyMetadata(new opertyChangedCallback(MyColorPropertyChanged)));
private static void MyColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  var thisControl = d as MyButton;
}
我可以使用我的自定义按钮:
<local:MyButton Width="130" MyColor="Red"/>

但是我被困住了。我如何将我的椭圆颜色(x:Name="Ellipse"上面)绑定到我的MyColor属性?

编辑:所以我使用Fill={TemplateBinding MyColor}在用户控件中绑定填充属性,但随后我得到Property MyColor was not found in type Button。我需要将模板定位为自定义MyButton类型,但我该怎么做呢?我可以把Button改成MyButton,这样我就会得到Property 'ContentTemplate' was not found in type 'MyButton'
<UserControl
 <snip/>
 x:Class="SilverlightApplication1.MyButton">
  <UserControl.Resources>
    <Style x:Key="ButtonStyle1" TargetType="Button">
      <snip/>
    </Style>
  </UserControl.Resources>
  <Grid x:Name="LayoutRoot">
    <Button Content="Test Button" Style="{StaticResource ButtonStyle1}"/>
  </Grid>
</UserControl>

如何在自定义模板中使用自定义属性

这里的问题是UserControl不是您控制的正确基础。你应该创建一个Templated控件。

在Visual Studio中添加新的"Silverlight模板控件"到您的项目MyButton

打开MyButton.cs并将其基类更改为Button。把你的MyColor依赖属性放到代码中。

主题/通用开放。并找到这个新的MyButton控件的默认样式。用模板替换该样式的Template。现在你的模板中的Fill="{TemplateBinding MyColor}"就可以工作了。

好的,首先,你的MyButton控件应该有一个DependencyProperty,比如MyColor——你有吗?在模板中,您应该使用TemplateBinding绑定到该属性。在使用控件的XAML中,您可以像这样使用它:<local:MyButton Width="130" MyColor="Red"/>

似乎你的模板缺少模板绑定:

<Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}"...>
    <Grid Background="{TemplateBinding Background}" Margin="1">
        ...
        <Ellipse x:Name="ellipse" Width="10" Height="10" HorizontalAlignment="Left"
                 Fill="{TemplateBinding MyColor}" />
    </Grid>
</Border>

顺便说一下,MyColor应该是真正的Brush,而不仅仅是Color