我有一个应用程序,我希望有2个可选接口:触摸屏和非触摸屏。
我显然可以制作两个单独的表单,但是有很多底层代码必须在它发生更改时重复。所有控件都相同,只是有不同的大小和位置。我正在考虑放入2个InitializeComponent方法,但后来我无法用visual studio设计这两个接口。
希望别人有任何想法。
答案 0 :(得分: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;
}
}
你会加载它:
TouchScreen touchThis = new TouchScreen();
ScreenForm form1 = new ScreenForm(touchThis);
form1.Show();
//or
NonTouchScreen notTouchThis = new NonTouchScreen();
ScreenForm form2 = new ScreenForm(notTouchThis);
form2.Show();
答案 1 :(得分:2)
您可能有兴趣查看此(及相关)问题:MVVM for winforms更具体地说是与WPF Application Framework (WAF)相关的内容。其中一个示例具有WinForms和WPF UI,共享相同的应用程序逻辑。在您的情况下,它只是两个不同的WinForms UI共享相同的应用程序逻辑。
另外,您是否考虑使用模板引擎(类似T4)来生成两种形式?
答案 2 :(得分:1)
如果这是一个winform,那么你可以为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方法中执行相同的操作。