将画布设置为控件模板?

3

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

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

在我的代码后台,我使用以下方法加载此图标:

LayoutGrid.Children.Add(FindResource("Icon") as Canvas);

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

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

现在的问题是:我该如何将"Icon"资源画布放入控件模板中?据我所知,Canvas没有样式或模板属性。它有一个Children属性,但无法通过XAML访问。我应该如何在模板中使用我的画布呢?


我为您更新了我的答案,并提供了更多信息。 - Drew Noakes
2个回答

9
当您创建一个资源类型,例如画布时,您正在创建该类型的一个实例。这意味着您不能在应用程序中的多个位置放置该资源(元素一次只能在一个位置)。您应该考虑使用控件模板。 对于此操作,您不需要任何代码后台。 示例如下:
<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}" />

请注意,这不是一个很好的按钮样式。请参考微软的示例,了解更全面特色的按钮模板。
编辑:
除非您在ControlTemplate中有ContentPresenter,则无需将模板分配给内容控件。请注意,任何从Control派生的类都可以进行模板化,包括Control本身。因此,为了将项目放入视图中,您只需使用:
<Control Template="{StaticResource Icon}" />

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


问题在于我想在我的应用程序的其他地方将我的图标用作画布,而不是模板。我知道我在字典中定义画布的方式只创建了一个实例,这就是为什么我创建了一个函数来克隆画布,以便创建多个实例并不是一个问题,但是将该图标用于按钮却让我感到困扰。 - Willson Haw
嗯...我还不是完全清楚你想做什么。如果你发布一些能够重现你所看到的错误的XAML代码,那会很有帮助。 - Drew Noakes
我想通了。我采用了您的建议并将所有内容转换为控件模板,然后在我的画布中只需添加一个 <ContentControl Template="{StaticResource icon}"/> 以显示图标作为画布,以及一个 <Button Template="{StaticResource icon}"/> 来将图标显示为按钮。感谢您指导我正确的方向! - Willson Haw

0

定义按钮图标的好方法是使用DrawingBrush,并将其设置为嵌入在Button中的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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接