【问题标题】:WPF: can I inherit a UserControl but provide no XAML?WPF:我可以继承 UserControl 但不提供 XAML 吗?
【发布时间】:2012-05-08 17:12:54
【问题描述】:

我正在扩展一个第 3 方应用程序,它使用看起来像是 PRISM 的早期版本来提供可组合性。

我制作了一个视图的原型,它非常简单。为了让我的 UI 插入到第 3 方 UI 中,我的 UserControl 必须实现一个特定的接口(如 IThirdPartyView)。

这很好。但是......现在我想以更生产的方式实现代码。一个关键点是我编写的 UserControls 需要不受污染,所以不要直接依赖于 3rd Party 的东西。如果我们切换到另一个第 3 方,我们不希望在代码中添加对另一个的依赖。

作为 OO 背景,我认为解决方案很简单:将我的 UI 放在一个不依赖于任何第 3 方的单独程序集中。我们称之为 CleanUserControl。然后在第 3 方特定实现中,扩展 CleanUserControl 类,并让该扩展类实现第 3 方特定接口以及扩展我的 CleanUserControl 类,因此类声明类似于:

public class SpecificUserControl : CleanUserControl, IThirdPartyView
{
    // Implementation of IThirdPartyView
}

但是...实际上我无法实现这一目标。

我设法让它编译,然后在运行时点击它:

组件“CustomerProfile.ThirdParty.View.SecurityView2”没有 由 URI '/CustomerProfile;component/view/securityview.xaml' 标识的资源

实际上我想我希望我的扩展只实现后面的代码并从父级继承 xaml,但我不知道这是否可以做到。

我希望我的问题很清楚,我无法解释它!

【问题讨论】:

    标签: wpf user-controls


    【解决方案1】:

    您不能继承 XAML。这是明确禁止的。您最好的机会是为内容创建一个通用 XAML 模板并将其应用于您的“派生”控件。您可以将模板放置在任何您想要的位置,无论是同一个程序集还是其他。

    另一种可能是实现你的父控件:

    • 将您的父控件创建为常规 XAML 控件
    • 编译程序集
    • 转到 obj 文件夹
    • 检查扩展名为 .g.cs 的控件的源代码
    • 复制自动生成的代码并重新开始使用纯 C# 创建控件

    【讨论】:

    • 我想我明白了,但不知道如何在 wpf 中做到这一点,我对它还很陌生。你能告诉我你的意思吗? UserControl 挺大的,一个数据输入表单,有 15 个左右的字段……
    • 这会很困难,因为入口控件是模板化的,所以它们不是控件的直接子控件。另一种选择是使用纯 C# 而不是 XAML 实现父控件。这是一个更简单的解决方案。看看我更新的答案
    • 听起来不像我所追求的。 “基础”控件需要能够在其他窗口以及第三方窗口上使用
    • 我没有看到任何限制。为什么你认为这是不可能的。您要求基本控件,这两种选择都允许您从中派生控件。第二个更容易。
    • 是的,我知道如何使用第二个来完成它,但是复制生成的 c# 并仅从代码创建基本控件并不是一个很好的可维护性解决方案。
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多