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

时间:2014-12-12 15:03:50

标签: c# wpf

我正在接受一些建议。我已经创建了一大堆WPF用户控件,这些控件都必须使用名为TcAdsClient的类。此类将始终用于使用其中一个用户控件的项目中。

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

有没有一种方法可以在不必调用方法或在构造函数中传递它的情况下获取引用。在某种程度上,我希望用户控件假设该类将始终可用。

希望这是有道理的,

BR

克里斯

2 个答案:

答案 0 :(得分:1)

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

我知道将整个解决方案移到Prsim只是因为这有点过分,但是它可能会在其他地方为您的应用程序架构带来更多好处。既然你已经遇到了构图问题,那么你可以从这种架构变化中获益,这可能是一个线索。

我知道这是非常一般的回复,但既然你是在征求建议而不是具体的实施,我希望它仍然有用。

答案 1 :(得分:0)

一个想法:

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

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;
}

另一种可能性是创建一个静态类,其中包含保存类的静态字段。创建表单后,您可以在那里存储您的类,每个自定义控件都可以查看它。或者甚至是包含类的不同实例的词典,其中包含控件可以关联的标记。

修改

但我认为这种行为可能导致更大错误的代码。 对我来说,包含一个属性更加“自然”,在该属性中,代码将设置要传递给控件的对象,如果提供了控件则让控件处理。