我知道这个问题可能会有很多“重复问题”的评论,但我还没有看到一个答案是有效的,或者不是简单地“不惜一切代价避免它”。但是在这里,我已经在一个名为"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中控件的行为呢?
发布于 2012-08-03 22:24:23
首先,请记住,ControlTemplate可以由用户多次更改,因此您需要确保重要的字段被清楚地标记。所以如果你想要一个OnClick事件。首先将你的按钮标记为“重要”
<Button x:Name="PART_MyButton"/>在你的控制类上标记这个也是个好主意
[TemplatePart(Name = "PART_MyButton", Type = typeof(Button))]
public class MyCustomControl : Control现在,您希望附加到该按钮的单击事件以执行此操作,请重写OnApplyTemplate方法。
public override void OnApplyTemplate()
{
mButton = Template.FindName("PART_MyButton", this) as Button;
mButton.Click += MyEventHandler;
}根据控件在没有控件的情况下能够正常工作的程度,您应该优雅地处理找不到的控件或引发异常。
最后一件事是。如果重写具有默认样式的控件,最好提供新的默认样式。
static MyCustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
}并在generic.xaml中放置隐式样式
https://stackoverflow.com/questions/11797244
复制相似问题