将Canvas设置为控件模板?

Wil*_*Haw 3 wpf canvas controltemplate

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

<Canvas x:Key="Icon">
     <Path ... />
     <Path ... />
</Canvas>
Run Code Online (Sandbox Code Playgroud)

在我的代码隐藏中,我使用加载此图标

LayoutGrid.Children.Add(FindResource("Icon") as Canvas);
Run Code Online (Sandbox Code Playgroud)

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

<ControlTemplate x:Key="IconTemplate">
    ...
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

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

Dre*_*kes 9

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

你不需要任何代码.

像这样的东西:

<ControlTemplate x:Key="Icon">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

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

<Button>
  <Control Template="{StaticResource Icon}" />
</Button>
Run Code Online (Sandbox Code Playgroud)

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

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

<ControlTemplate x:Key="Icon" TargetType="Button">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

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

<Button Template="{StaticResource Icon}" />
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个很棒的按钮样式.请查看Microsoft的此示例,以获取功能更全面的按钮模板示例.

编辑

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

<Control Template="{StaticResource Icon}" />
Run Code Online (Sandbox Code Playgroud)

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