帆布与儿童作为一种风格

时间:2011-02-10 04:43:36

标签: silverlight

很抱歉,如果这是一个密集的问题,但我想看看是否有办法在App.xaml中拥有Canvas的样式资源,并在该Canvas上有子项并且只是引用它在另一个画布的Style中。我设想的资源将是:

<Style x:Key="Background1" TargetType="Canvas">
            <Setter Property="Width" Value="500"/>
            <Setter Property="Height" Value="600" />
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Children">
                <Setter.Value>
                    <Rectangle Canvas.Top="20" Canvas.Left="20"  Width="100" Height="100" Fill="Yellow"></Rectangle>
                </Setter.Value>
            </Setter>
        </Style>

然后调用它就像:

<Canvas Style="{StaticResource Background1}"  x:Name="CanvasRoot"  >
    <Rectangle x:Name="PageRectangle" Canvas.Left="114" Canvas.Top="84" Height="378" Width="210" Stroke="#92D050" Fill="#C0504D" />
</Canvas>

是否可以做到这样的事情的任何想法。我所做的不起作用,因为Canvas上没有“Children”属性。

1 个答案:

答案 0 :(得分:3)

所以你想通过Style将一个孩子添加到Canvas中?我担心这根本不可能。样式允许您设置元素依赖项属性的值,例如高度,背景,描边等...您还可以使用它们来设置附加属性。但是,您尝试设置的Children属性不是依赖项属性,它是在可视树中描述画布子项的子元素集合。

使用样式在可视树中添加新元素的唯一方法是将它们添加到某些控件模板中。不幸的是,您可以使用模板面板(Canvas,Grid,StackPanel)。您可以使用ContentControl并将矩形添加为其模板的一部分。

ContentControl是单个孩子的无形容器。请参阅此处描述的模板:

http://msdn.microsoft.com/en-us/library/dd334411%28VS.95%29.aspx

这里是添加矩形的模板。我不确定你想要实现的布局,但它应该给你一般的想法

<Style TargetType="ContentControl" x:Key="myContentControl">
      <Setter Property="Foreground" Value="#FF000000"/>
      <Setter Property="HorizontalContentAlignment" Value="Left"/>
      <Setter Property="VerticalContentAlignment" Value="Top"/>
      <Setter Property="Template">
          <Setter.Value>
              <ControlTemplate TargetType="ContentControl">
                  <Canvas>
                    <Rectangle Canvas.Top="20" Canvas.Left="20"  Width="100" Height="100" Fill="Yellow"></Rectangle>
                    <ContentPresenter
                        Content="{TemplateBinding Content}"
                        ContentTemplate="{TemplateBinding ContentTemplate}"
                        Cursor="{TemplateBinding Cursor}"
                        Margin="{TemplateBinding Padding}"
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                  </Canvas>
              </ControlTemplate>
          </Setter.Value>
      </Setter>

<ContentControl Style={StaticResource myContentControl}>
  <Canvas x:Name="CanvasRoot"  >
    <Rectangle x:Name="PageRectangle" Canvas.Left="114" Canvas.Top="84" Height="378" Width="210" Stroke="#92D050" Fill="#C0504D" />
  </Canvas>
</ContentControl>