我的(Surface)UserControls共享大量代码。所以我想定义一个抽象超类,我可以在其中定义这个公共代码和行为。
但是如何为(Surface)UserControl定义抽象超类呢?我试图将SurfaceUserControl的代码隐藏文件子类化,但后来我收到以下错误:
Partial declarations of 'Prototype_Concept_2.views.DependencyExpander' must not specify different base classes C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\views\DependencyExpander.xaml.cs
答案 0 :(得分:1)
问题是你的Xaml文件可能仍然以:
开头<UserControl x:Class="..."
但是,如果你从不同的类型(不是UserControl
,而是SurfaceUserControl
)派生你的类,那么你就是说同一个类是两个类的子类。
虽然你可以制作一个自定义控件,并且可以创建它的子类,但我个人发现这可能比预期更有问题。我建议尝试以不同的方式处理它。
不是尝试为UserControl创建单个超类,而是使用封装将责任委派给单个类通常更容易。每个UserControl都可以通过这种方式处理共享行为。或者,您可以使用共享DataContext(或其中的共享层次结构)。
答案 1 :(得分:1)
从SurfaceUserControl(或适当的SurfaceControl或SurfaceContentControl或SurfaceItemsControl)派生绝对是一件好事,因为它将使您的控件的使用者更容易使用Surface事件。你是对的,但这导致了大量的代码重复。
当我们构建Surface SDK时,采用了大量自动代码生成来缓解此问题。如果您使用Reflector来查看Surface控件的实现方式,您会发现控件内置的逻辑非常少 是一些辅助类,其中包含大量逻辑,可以被每个控件利用。
答案 2 :(得分:0)
从中派生用户控件的基本控件不必是SurfaceUserControl。因此,创建一个模板化的自定义控件,该控件可以从SurfaceContentControl派生,并将大部分代码放在该基类上共享。