将Canvas设置为控件模板?

时间:2009-10-20 22:10:23

标签: wpf canvas controltemplate

我在ResourceDictionary xaml文件中有一个Canvas,如下所示:

<Canvas x:Key="Icon">
     <Path ... />
     <Path ... />
</Canvas>

在我的代码隐藏中,我使用

加载此图标
LayoutGrid.Children.Add(FindResource("Icon") as Canvas);

这很好用。现在我想创建一个使用相同图标作为模板的按钮。所以我创建了一个控件模板:

<ControlTemplate x:Key="IconTemplate">
    ...
</ControlTemplate>

现在问题是:如何将“Icon”资源画布放入控件模板?据我所知,Canvas没有Style或Template属性。它有一个儿童酒店,但无法通过XAML访问。我如何在模板中使用我的画布?

2 个答案:

答案 0 :(得分:9)

当您创建诸如canvas之类的资源作为资源时,您将创建该类型的 ONE 实例。这意味着您无法将该资源放在应用程序的多个位置(一个元素一次只能放在一个位置)。我认为你应该考虑使用控制模板。

您不需要任何代码。

这样的事情:

<ControlTemplate x:Key="Icon">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>

然后在其他地方你做这样的事情:

<Button>
  <Control Template="{StaticResource Icon}" />
</Button>

这会构建一个常规的按钮,其中包含您的图标内容。该按钮的内容就是您的图标。

但是,如果您想完全重新定义按钮的模板,那么您可以这样做

<ControlTemplate x:Key="Icon" TargetType="Button">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>

然后在其他地方你做这样的事情:

<Button Template="{StaticResource Icon}" />

请注意,对于按钮来说,这不是一个很好的风格。请查看this example from Microsoft以获取功能更全面的按钮模板示例。

修改

除非ContentPresenter中有ControlTemplate,否则无需将模板分配给内容控件。请注意,从Control派生的任何类都可以模板化,包括Control本身。因此,为了将项目放入您的视图中,您可以使用:

<Control Template="{StaticResource Icon}" />

这使用层次结构中最宽的适用类型,也是最轻的。

答案 1 :(得分:0)

为按钮定义图标的好方法是使用 DrawingBrush 并将其设置为嵌入中的 Rectangle 的填充按钮

<Button>
    <Rectangle
        Width="32"
        Height="32"
        Fill={Background myDrawingBrush}
    />
</Button>
必须在以下资源中定义

myDrawingBrush

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options">
    <DrawingBrush x:Key="dialogerror" Stretch="Uniform">
        <DrawingBrush.Drawing>
            <DrawingGroup>
                <GeometryDrawing>
                    ... define geometry here ...
                </GeometryDrawing>
        </DrawingBrush.Drawing>
    </DrawingBrush>
</ResourceDictionary>