WPF - 继承自变量类的类

时间:2012-09-06 14:44:03

标签: c# wpf inheritance

我有一个应用程序可以用两种不同的方式显示项目,使用StackPanel的行或使用WrapPanel的图标。它显示这些项目的方式取决于配置设置。为了填充这些面板,我有两个单独的类,一个从WrapPanel继承,另一个从StackPanel继承。我能够使用Inferface减少重复的代码。但是我仍然有很多重复的代码,代码之间的唯一区别是对StackPanel或WrapPanel的引用。

我真正想要做的是创建一个继承自StackPanel或WrapPanel的类,具体取决于配置设置。

public class ContainerBase : <wrap or stack>
{

//Do stuff!

}

这可能吗?我接近这个错误吗?

4 个答案:

答案 0 :(得分:1)

您可以使用Generics;

public class ContainerBase<T>  where T : Panel

然后,您可以使用配置设置初始化正确的类型。

答案 1 :(得分:1)

当我在第一条评论中说“作文而非继承”时,我的意思如下:

public class PanelPresentatinLogic
{
    public Panel Panel{get;set;}     

    public void DoSomeDuplicatingStuff()
    {
        //Do stuff! with Panel
    }    
}

public class SortOfStackPanel : StackPanel
{
    private readonly PanelPresentatinLogic _panelPresentatinLogic;

    public SortOfStackPanel(PanelPresentatinLogic presentationLogic)
    {
        _panelPresentatinLogic = presentationLogic;
        _panelPresentatinLogic.Panel = this;
    }

    public void DoSomeDuplicatingStuff()
    {
        _panelPresentatinLogic.DoSomeDuplicatingStuff();
    }
}


public class SortOfWrapPanel : WrapPanel
{
    private readonly PanelPresentatinLogic _panelPresentatinLogic;

    public SortOfWrapPanel(PanelPresentatinLogic presentationLogic)
    {
        _panelPresentatinLogic = presentationLogic;
        _panelPresentatinLogic.Panel = this;
    }

    public void DoSomeDuplicatingStuff()
    {
        _panelPresentatinLogic.DoSomeDuplicatingStuff();
    }
}

public class UsageSample
{
    public void PopulateCollectionOfItemsDependingOnConfigHopeYouveGotTheIdea()
    {
        string configValue = configuration["PanelKind"];
        PanelPresentatinLogic panelPresentatinLogic = new PanelPresentatinLogic();

        Panel panel = configValue == "Wrap" 
            ? new SortOfWrapPanel(panelPresentatinLogic)
            : new SortOfStackPanel(panelPresentatinLogic);
        // TODO: add panel to GUI
    }
}  

答案 2 :(得分:1)

在WPF中,您不打算使用控件来填充自身。相反,使用MVVM模式。

只需一个提供数据的类(通常是ObservableCollection)并将“视图模式变量”加载到MVVM的属性中,就可以实现目标。

然后,您可以使用带有DataTemplateSelector的ItemsPanel来选择视图。

答案 3 :(得分:0)

可能你可以使用Panel吗?

    public class ContainerBase : <wrap or stack>
    {

    //Do stuff!

    }