在Silverlight中如何在XAML中设置UserControl子级的样式?

在Silverlight中如何在XAML中设置UserControl子级的样式?,silverlight,xaml,silverlight-5.0,Silverlight,Xaml,Silverlight 5.0,我有一个usercontrolmyparentcontrol,其中有另一个控件(TreeView)。我将此控件作为dep属性公开,例如TreeView MyChildControl 然后在使用MyParentConrol的XAML中,我想访问所有的TreeView属性,例如Style 我想写一些像: <my:MyParentControl> <my:MyParentControl.MyChildControl.Style> <Style /&

我有一个
usercontrolmyparentcontrol
,其中有另一个控件(TreeView)。我将此控件作为dep属性公开,例如
TreeView MyChildControl

然后在使用MyParentConrol的XAML中,我想访问所有的TreeView属性,例如Style

我想写一些像:

<my:MyParentControl>
    <my:MyParentControl.MyChildControl.Style>
        <Style />
    </my:MyParentControl.MyChildControl.Style>
</my:MyParentControl>


有什么方法可以实现这一点吗?

您可以通过这样编写XAML来实现这一效果:

<my:MyParentControl>
   <my:MyParentControl.Resources>
      <Style TargetType="my:MyChildControl">
         <Setter Property="Background" Value="Red"/>
      </Style>
   </my:MyParentControl.Resources>
<my:MyParentControl>


在本例中,此XAML创建了一个MyParentControl,其中MyChildControl类型的所有子项都有红色背景。

您可以通过如下方式编写XAML来获得此效果:

<my:MyParentControl>
   <my:MyParentControl.Resources>
      <Style TargetType="my:MyChildControl">
         <Setter Property="Background" Value="Red"/>
      </Style>
   </my:MyParentControl.Resources>
<my:MyParentControl>


在本例中,此XAML创建了一个MyParentControl,其中MyChildControl类型的所有子项都有红色背景。

通过公开内部控件的DependencyProperty,您已经解决了一半问题-即您可以在XAML中设置单个属性

下一步是让这些属性设置器影响子控件

实现这一目标有两种选择

  • 在控件模板中,定义子控件并对要设置的每个属性使用绑定

  • 在父控件模板中定义容器元素,并在依赖项属性更改时将其内容设置为子控件

  • 尽管这两种方法都可以工作,但您可能会发现,涉及最少代码量和最大灵活性的解决方案是公开子控件的样式属性,并在控件模板中应用该属性

    public class ParentControl : Control
    {
        public Style ChildControlStyle
        {
            get { return (Style)GetValue(ChildControlStyleProperty); }
            set { SetValue(ChildControlStyleProperty, value); }
        }
    
        public static readonly DependencyProperty ChildControlStyleProperty =
            DependencyProperty.Register("ChildControlStyle", 
                                        typeof(Style), 
                                        typeof(ParentControl), 
                                        new PropertyMetadata(null));
    }
    


    通过公开内部控件的DependencyProperty,您已经解决了一半的问题-即您可以在xaml中设置单个属性

    下一步是让这些属性设置器影响子控件

    实现这一目标有两种选择

  • 在控件模板中,定义子控件并对要设置的每个属性使用绑定

  • 在父控件模板中定义容器元素,并在依赖项属性更改时将其内容设置为子控件

  • 尽管这两种方法都可以工作,但您可能会发现,涉及最少代码量和最大灵活性的解决方案是公开子控件的样式属性,并在控件模板中应用该属性

    public class ParentControl : Control
    {
        public Style ChildControlStyle
        {
            get { return (Style)GetValue(ChildControlStyleProperty); }
            set { SetValue(ChildControlStyleProperty, value); }
        }
    
        public static readonly DependencyProperty ChildControlStyleProperty =
            DependencyProperty.Register("ChildControlStyle", 
                                        typeof(Style), 
                                        typeof(ParentControl), 
                                        new PropertyMetadata(null));
    }
    

    
    
    我相信这是一个非常好的答案。谢谢你。不幸的是,可能只有一个马克,而那个家伙想出了一个解决方案,这对我来说更具吸引力。但我还是你的好!我相信这是一个很好的答案。谢谢你。不幸的是,可能只有一个马克,而那个家伙想出了一个解决方案,这对我来说更具吸引力。但我还是你的好!