WPF 中派生 ControlTemplate 的问题

发布于 2024-08-25 07:46:49 字数 1522 浏览 7 评论 0原文

以下 xaml 代码有效:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <ControlTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </ControlTemplate>
  </Button.Template>
 </Button>
</Window>

现在,如果您定义以下数据模板:

using System.Windows.Controls;

namespace DerivedTemplateBug
{
 public class DerivedTemplate : ControlTemplate
 {
 }
}

然后将 ControlTemplate 交换为派生类:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <local:DerivedTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </local:DerivedTemplate>
  </Button.Template>
 </Button>
</Window>

您会收到以下错误:

“DerivedTemplateBug.DerivedTemplate”类型上的 ContentPropertyAttribute 无效,未找到属性“Content”。

谁能告诉我为什么会这样?

The following xaml code works:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <ControlTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </ControlTemplate>
  </Button.Template>
 </Button>
</Window>

Now, if you define the following data template:

using System.Windows.Controls;

namespace DerivedTemplateBug
{
 public class DerivedTemplate : ControlTemplate
 {
 }
}

And then swap the ControlTemplate for the derived class:

<Window x:Class="DerivedTemplateBug.Window1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:DerivedTemplateBug"
 Title="Window1" Height="300" Width="300">
 <Button>
  <Button.Template>
   <local:DerivedTemplate>
    <Border BorderBrush="Black" BorderThickness="2">
     <TextBlock>Testing!</TextBlock>
    </Border>
   </local:DerivedTemplate>
  </Button.Template>
 </Button>
</Window>

You get the following error:

Invalid ContentPropertyAttribute on type 'DerivedTemplateBug.DerivedTemplate', property 'Content' not found.

Can anyone tell me why this is the case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情未る 2024-09-01 07:46:49

当我尝试此操作时,出现不同的错误:

'Border' object cannot be added to 'DerivedTemplate'. 
Object of type 'System.Windows.Controls.Border' cannot be converted 
to type 'System.Windows.FrameworkElementFactory'.

查找 FrameworkElementFactory,看来这是在代码中创建模板的旧方法:

此类是一种已弃用的方法
以编程方式创建模板,
哪些是子类
框架模板如
控制模板或数据模板;不是
所有模板功能都是
创建模板时可用
使用此类。

我的问题是,为什么要继承 ControlTemplate ?我想不出这样做的用例。如果您只是尝试在代码隐藏中创建自己的模板,MSDN 建议使用以下方法:

推荐的方法
以编程方式创建模板是
从字符串或内存加载 XAML
使用 Load 方法进行流传输
XamlReader 类。

I get a different error when I try this:

'Border' object cannot be added to 'DerivedTemplate'. 
Object of type 'System.Windows.Controls.Border' cannot be converted 
to type 'System.Windows.FrameworkElementFactory'.

Looking up FrameworkElementFactory, it appears this was an old way of creating templates in code:

This class is a deprecated way to
programmatically create templates,
which are subclasses of
FrameworkTemplate such as
ControlTemplate or DataTemplate; not
all of the template functionality is
available when you create a template
using this class.

My question is, why are you inheriting from ControlTemplate? I can't think of a use case for doing this. If you are simply trying to create your own templates in code-behind, MSDN recommends the following approach:

The recommended way to
programmatically create a template is
to load XAML from a string or a memory
stream using the Load method of the
XamlReader class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文