【问题标题】:Setting Canvas to a control template?将 Canvas 设置为控件模板?
【发布时间】:2009-10-20 22:10:23
【问题描述】:

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

【问题讨论】:

  • 我更新了我的答案,为您提供了更多信息。

标签: wpf canvas controltemplate


【解决方案1】:

当您创建诸如画布之类的类型作为资源时,您正在创建该类型的 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 以获取功能更全面的按钮模板示例。

编辑

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

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

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

【讨论】:

  • 这个问题是我希望能够在我的应用程序的其他地方使用我的图标作为画布,而不是作为模板。我知道我在字典中定义画布的方式只创建一个实例,这就是为什么我创建了一个函数来克隆画布所以创建多个实例不是问题,它只是在一个按钮中使用那个图标给我带来了麻烦.
  • 嗯...我仍然不是 100% 清楚您要做什么。如果您发布了一些 XAML 来重现您所看到的错误,那将会很有帮助。
  • 我想通了。我刚刚接受了你的建议,我把所有东西都变成了一个控制模板。然后在我的画布中,我只是添加了一个 以将图标显示为画布,并添加 以将图标显示为按钮。感谢您为我指明正确的方向!
【解决方案2】:

为按钮定义图标的一个好方法是使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多