2

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

我真正想做的是根据配置设置创建一个从 StackPanel 或 WrapPanel 继承的类。

public class ContainerBase : <wrap or stack>
{

//Do stuff!

}

这可能吗?我是在错误地接近这个吗?

4

4 回答 4

1

您可以为此使用泛型;

public class ContainerBase<T>  where T : Panel

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

于 2012-09-06T14:55:44.290 回答
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
    }
}  
于 2012-09-06T15:20:26.037 回答
1

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

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

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

于 2012-09-06T15:21:03.597 回答
0

也许你可以使用面板?

    public class ContainerBase : <wrap or stack>
    {

    //Do stuff!

    }
于 2012-09-06T15:09:41.907 回答