Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将画布设置为控件模板?_Wpf_Canvas_Controltemplate - Fatal编程技术网

Wpf 将画布设置为控件模板?

Wpf 将画布设置为控件模板?,wpf,canvas,controltemplate,Wpf,Canvas,Controltemplate,我在ResourceDictionary xaml文件中有一个画布,如下所示: <Canvas x:Key="Icon"> <Path ... /> <Path ... /> </Canvas> 这个很好用。现在我想创建一个按钮,它使用与模板相同的图标。因此,我创建了一个控件模板: <ControlTemplate x:Key="IconTemplate"> ... </ControlTemplate

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

<Canvas x:Key="Icon">
     <Path ... />
     <Path ... />
</Canvas>
这个很好用。现在我想创建一个按钮,它使用与模板相同的图标。因此,我创建了一个控件模板:

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

...

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

当您创建一个类型(如画布)作为资源时,您正在创建该类型的一个实例。这意味着您不能将该资源放在应用程序中的多个位置(一个元素一次只能放在一个位置)。我认为,您应该看看如何使用控件模板

你不需要任何代码

大概是这样的:

<ControlTemplate x:Key="Icon">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>
<Button>
  <Control Template="{StaticResource Icon}" />
</Button>
<Button Template="{StaticResource Icon}" />
<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>

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

为按钮定义图标的一个好方法是使用绘图笔刷,并将其设置为嵌入按钮中的矩形的填充:


myDrawingBrush必须在以下资源中定义:

<ControlTemplate x:Key="Icon">
  <Canvas>
   <Path ... />
   <Path ... />
  </Canvas>
</ControlTemplate>
<Button>
  <Control Template="{StaticResource Icon}" />
</Button>
<Button Template="{StaticResource Icon}" />
<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>

... 在这里定义几何体。。。

问题在于,我希望能够将我的图标用作应用程序中其他位置的画布,而不是模板。我知道我在字典中定义画布的方式只创建了一个实例,这就是为什么我创建了一个函数来克隆画布,所以创建多个实例不是问题,只是在按钮中使用了那个图标,这给我带来了麻烦。嗯。。。我还不是100%清楚你想做什么。如果你发布了一些XAML来重现你所看到的错误,那会很有帮助。我找到了答案。我只是同意你的建议,我把所有的东西都变成了一个控制模板。然后在我的画布中,我只添加了一个图标,将图标显示为画布,并将图标显示为按钮。谢谢你给我指明了正确的方向!我更新了我的答案,为你提供了更多的信息。