我在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访问。我如何在模板中使用我的画布?
答案 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>