2011-08-04 44 views
4

我有一个应用程序,我希望有2个可选接口:触摸屏和非触摸屏。为表单创建多个接口

我明显可以做出2个独立的表单,但是有很多底层代码在它发生变化时必须重复。所有的控件都是一样的,它们只有不同的尺寸和位置。我正在考虑放入2个InitializeComponent方法,但后来我无法用Visual Studio设计这两个接口。

希望别人有什么想法。

+2

它是一个Windows应用程序或Web应用程序? – R0MANARMY

+0

Windows应用程序 –

回答

5

我认为这将是一个接口与两个实现,然后你注入一个你想要的形式。

一个简单的例子:

public interface IScreen 
{ 
    void DoStuff(); 
} 

public class TouchScreen : IScreen 
{ 
    public void DoStuff() 
    { } 
} 

public class NonTouchScreen : IScreen 
{ 
    public void DoStuff() 
    { } 
} 

public partial class ScreenForm : Form 
{ 
    IScreen _ScreenType; 

    public ScreenForm(IScreen screenType) 
    { 
    InitializeComponent(); 
    _ScreenType = screenType; 
    } 
} 

而且你会因此加载它:如果这是一个winform

TouchScreen touchThis = new TouchScreen(); 
    ScreenForm form1 = new ScreenForm(touchThis); 
    form1.Show(); 

    //or 

    NonTouchScreen notTouchThis = new NonTouchScreen(); 
    ScreenForm form2 = new ScreenForm(notTouchThis); 
    form2.Show(); 
1

,那么你可以添加Load事件的事件处理程序:

this.Load += new System.EventHandler(this.YourForm_Load); 

...在那里,你可以检查这是否是触摸屏,然后安排位置,形状和大小在为这两种情况分开辅助方法。

private void YourForm_Load(object sender, System.EventArgs e) 
{ 
    if (IsTouchScreen) 
    { 
    ArrangeControlsForTouchScreen(); 
    } 
    else 
    { 
    ArrangeControlsForPlainScreen(); 
    } 
} 

如果这是在一个网页中,那么您可以在重写的Page.Load方法中做几乎相同的操作。

+0

我想过这个选项,但是有没有一种方法可以用Visual Studio设计这两个接口? –

+0

我发现我有更好的精度,当我这样做以编程方式。这是个人偏好,不过... 如果你想在VS中用鼠标做到这一点,有一个基本类/形式,它做了一切,然后从它派生出来放置按钮和其他用户界面元素。然后再次派生并为另一个版本创建第二个表单。然后,在运行时,实例化适合情况的表单类。 (我想有很多方法可以做你想做的事) – woohoo

2

您可能有兴趣查看此(及相关)问题:MVVM for winforms更具体的与WPF Application Framework (WAF)相关的内容。其中一个示例具有共享相同应用程序逻辑的WinForms和WPF UI。在你的情况下,它只是两个不同的WinForms UI共享相同的应用程序逻辑。

另外,你有没有考虑过使用模板引擎(如T4)来生成这两种形式?