我有一个应用程序可以用两种不同的方式显示项目,使用StackPanel的行或使用WrapPanel的图标。它显示这些项目的方式取决于配置设置。为了填充这些面板,我有两个单独的类,一个从WrapPanel继承,另一个从StackPanel继承。我能够使用Inferface减少重复的代码。但是我仍然有很多重复的代码,代码之间的唯一区别是对StackPanel或WrapPanel的引用。
我真正想要做的是创建一个继承自StackPanel或WrapPanel的类,具体取决于配置设置。
public class ContainerBase : <wrap or stack>
{
//Do stuff!
}
这可能吗?我接近这个错误吗?
答案 0 :(得分:1)
答案 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!
}