引用将存在于 WPF 项目中的自定义 WPF 用户控件中的类

本文关键字:WPF 自定义 用户 控件 项目 存在 引用 | 更新日期: 2023-09-27 18:34:03

我正在寻求一些建议。我创建了大量 WPF 用户控件,所有这些控件都必须与名为 TcAdsClient 的类一起使用。此类将始终用于使用这些用户控件之一的项目。

为了获得对该类的引用,我在每个用户控件中设置了一个名为init(TcAdsClient)的方法。然后,对于使用的每个控件,我在 MainWindow 加载时调用此方法,并将对类的引用传递到该类。

有没有办法让我无需调用方法或在构造函数中传递它即可获取引用。在某种程度上,我希望用户控件假定该类将一如既往地可用。

希望这是有道理的,

BR

克里斯

引用将存在于 WPF 项目中的自定义 WPF 用户控件中的类

考虑一个依赖注入框架(Prism,MEF)。在引导程序中初始化类,然后框架负责在控件的构造函数中出现时注入它。虽然您仍然必须在构造函数中添加它,但整个初始化过程已为您完成(没有访问时不会初始化的风险)。

我知道仅仅因为这样才将整个解决方案迁移到 Prsim 有点矫枉过正,但它也可能为您的应用程序架构在其他地方提供更多好处。而且由于您已经遇到了组合问题,因此您可能可以从这种架构更改中受益。

我知道这是非常笼统的回复,但由于您是在寻求建议而不是具体的实现,我希望它仍然会有所帮助。

一个想法:

创建一个接口,该接口将保存所需类的属性:

public interface IMyClass
{
    MyClass TheClassINeed { get; }
}

在要放置控件的窗体中,实现类。

public partial class MainWindow : Window, IMyClass
{
    public MyClass TheClassINeed { get; set; }
}

在控件中选择一个事件以搜索实现 IMyClass 并获取接口的父级。

如果你在 XAML 中有窗体的名称,则可以使用以下内容:

IMyClass interfElem = null;
UIElement element = sender;
for(;;)
{
    element = VisualTreeHelper.GetParent(element) as UIElement;
    if (element == null)
        break;
    interfElem = element as IMyClass;
    if (interfElem == null)
        continue;
    break;
}

另一种可能性是创建一个静态类,其中包含一个保存类的静态字段。创建窗体后,可以将类存储在其中,并且每个自定义控件都可以查看它。甚至是具有不同类实例的字典,其中包含控件可以关联的标记。

编辑

但我认为这种操作可能会导致更大的容易出错的代码。对我来说,包含一个属性更"自然",在该属性中,代码将设置要传递给控件的对象,并让控件处理是否提供它。