3

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

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

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

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

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

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

现在问题来了:如何将“图标”资源画布放入控件模板中?据我所知,Canvas 没有 Style 或 Template 属性。它有一个 Children 属性,但不能通过 XAML 访问它。我将如何在模板中使用我的画布?

4

2 回答 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}" />

请注意,这不是按钮的好样式。查看Microsoft的这个示例,了解功能更全面的按钮模板示例。

编辑

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

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

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

于 2009-10-20T23:05:07.030 回答
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>
于 2011-10-13T07:37:47.040 回答