1

我知道这个问题可能会得到很多“重复问题”的评论,但我还没有看到一个有效的答案,或者不仅仅是“不惜一切代价避免它”。但是在这里,我创建了一个控件,让我们在一个名为“ControlA_Project”的项目中将其称为“ControlA”,我打算在一个名为“ControlB”的控件中覆盖它的一些虚拟方法,该控件在另一个名为“控制B_项目”。想法是“ControlA”具有保存和加载方法,我希望从保存和加载到文件,也保存和加载到数据库(如果稍后需要另一种保存和加载类型,我可以再次覆盖这些方法) . 我遇到的问题是我最初有“ControlA”

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

谷歌搜索错误我得出的结论是你不能从用户控件继承(或者为了争论,这不是一个好主意)。所以我然后将控件从用户控件更改为自定义控件。然而,这又导致我遇到另一个问题,控件模板不像用户控件中那样链接到后面的代码(即 On_Click),并且没有简单的方法来简单地覆盖行为(据我所知) . 我知道我可以通过复制和粘贴 ControlAs 模板并更改几行来重新模板 ControlB,但 controlA 有一个大模板,并且制作多个副本似乎浪费空间。简而言之,是否有正确的方法来改变 wpf 中控件的行为?

4

1 回答 1

2

首先,请记住 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

于 2012-08-03T14:24:22.550 回答