我确信这是一个真正的初学者问题;我只是在弄清楚如何搜索它。
我有一个简单的UserControl(MyNewControl),只有三个控件,其中一个是以下标签:
<sdk:Label x:Name="Title" />
在另一个控件中,我想使用MyNewControl,如下所示:
<local:MyNewControl Grid.Column="1" x:Name="MyNewGuy" />
我需要做什么才能让第二个控件为我的标题标签设置渐变背景?
答案 0 :(得分:1)
首先在UserControl中定义所需的依赖项属性:
public partial class MyUserControl : UserControl
{
public Brush LabelBackground
{
get { return (Brush)GetValue(LabelBackgroundProperty); }
set { SetValue(LabelBackgroundProperty, value); }
}
public static readonly DependencyProperty LabelBackgroundProperty =
DependencyProperty.Register("LabelBackground", typeof(Brush), typeof(MyUserControl), new PropertyMetadata(null));
public MyUserControl()
{
InitializeComponent();
}
}
要将属性的值分配给子标签,可以使用绑定的ElementName属性进行绑定:
<UserControl x:Class="SilverlightApplication1.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
d:DesignHeight="300"
d:DesignWidth="400"
mc:Ignorable="d"
x:Name="UserControl"
>
<Grid x:Name="LayoutRoot">
<sdk:Label x:Name="Title"
HorizontalAlignment="Center"
VerticalAlignment="Center" Content="Title" Background="{Binding LabelBackground, ElementName=UserControl}" />
</Grid>
</UserControl>
当您使用Silverlight 5时,您还可以为绑定设置RelativeSource,而不是在内部命名您的UserControl:
<sdk:Label Background="{Binding LabelBackground, RelativeSource={RelativeSource AncestorType=UserControl}}" />
然后,在使用UserControl时,只需将LabelBackground设置(或绑定)到所需的值:
<local:MyUserControl LabelBackground="Red"/>
请注意,您还可以创建CustomControl而不是UserControl,以相同的方式添加依赖项属性use a TemplateBinding when defining its template。
答案 1 :(得分:0)
您可以使用自定义控件中的dependency property执行此操作。假设您在自定义控件中将LableBG定义为依赖项属性,并使用xaml中已定义Label控件的Background进行绑定。当您在另一个控件中使用自定义控件时,您可以从xaml或后面的代码设置它的LableBG。
注意:您定义的依赖项属性的类型应为Brush
例如:
在自定义控件的cs文件中定义依赖项属性:
/1. Declare the dependency property as static, readonly field in your class.
public static readonly DependencyProperty LableBGProperty = DependencyProperty.Register(
"LableBG", //Property name
typeof(Brush), //Property type
typeof(MySilverlightControl), //Type of the dependency property provider
null );//Callback invoked on property value has changes
<sdk:Label x:Name="Title" Background="{Binding LableBG }" /> (Custom Control)
<local:MyNewControl Grid.Column="1" x:Name="MyNewGuy" LableBG="Red" /> (Another control)