首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户控件、自定义控件、继承和重写

用户控件、自定义控件、继承和重写
EN

Stack Overflow用户
提问于 2012-08-03 22:00:36
回答 1查看 1.4K关注 0票数 1

我知道这个问题可能会有很多“重复问题”的评论,但我还没有看到一个答案是有效的,或者不是简单地“不惜一切代价避免它”。但是在这里,我已经在一个名为"ControlA_Project“的项目中创建了一个叫做"ControlA”的控件,并且我打算在一个名为"ControlB“的控件中重写它的一些虚拟方法,该控件继承了另一个名为"ControlB_Project”的项目中的"ControlA“。这个想法是"ControlA“有保存和加载方法,我希望从保存和加载到文件,也保存和加载到数据库(如果以后需要另一个保存和加载类型,我可以再次覆盖这些方法)。我遇到的问题是,我最初将"ControlA“作为用户控件,当我尝试将带有覆盖("ControlB")的新控件添加到窗口中时,我会收到以下错误:

组件“ControlB_Project.ControlB”没有由URI '/ControlA_Project;component/usercontrols/ControlA.xaml'.标识的资源

谷歌一下这个错误,我得出的结论是,你不能从用户控件继承(或者为了争论,这不是一个好主意)。因此,我随后将控件从用户控件更改为自定义控件。然而,这就引出了另一个问题,控件的模板并不像在用户控件中那样链接到后台的代码(即On_Click),也没有简单的方法来简单地覆盖行为(据我所知)。我知道我可以通过复制和粘贴ControlAs模板和更改几行代码来重刻ControlB,但是controlA有一个很大的模板,而且复制多个副本似乎是浪费空间。那么简单地说,有没有一种正确的方法来改变wpf中控件的行为呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-03 22:24:23

首先,请记住,ControlTemplate可以由用户多次更改,因此您需要确保重要的字段被清楚地标记。所以如果你想要一个OnClick事件。首先将你的按钮标记为“重要”

代码语言:javascript
复制
<Button x:Name="PART_MyButton"/>

在你的控制类上标记这个也是个好主意

代码语言:javascript
复制
[TemplatePart(Name = "PART_MyButton", Type = typeof(Button))]
public class MyCustomControl : Control

现在,您希望附加到该按钮的单击事件以执行此操作,请重写OnApplyTemplate方法。

代码语言:javascript
复制
public override void OnApplyTemplate()
{
    mButton = Template.FindName("PART_MyButton", this) as Button;
    mButton.Click += MyEventHandler;
}

根据控件在没有控件的情况下能够正常工作的程度,您应该优雅地处理找不到的控件或引发异常。

最后一件事是。如果重写具有默认样式的控件,最好提供新的默认样式。

代码语言:javascript
复制
static MyCustomControl()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
}

并在generic.xaml中放置隐式样式

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11797244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档