gpt4 book ai didi

C# - 将 UI 与业务代码分开

转载 作者:太空狗 更新时间:2023-10-30 01:26:22 25 4
gpt4 key购买 nike

我想知道以下情况的最佳做法是什么:

我正在开发一个需要在三种不同屏幕尺寸上使用的应用程序:240x320; 800x600 ; 1280x1024(并且只有这三种)不同语言(使用本地化)。

所以我所做的是按屏幕大小创建一个库,每个库都实现在调用这些屏幕的项目中定义的接口(interface)。

第一个问题是,我所有的资源文件都是重复的,而且有很多文件需要保持最新(或带有重复的标签)。有没有简单的方法来改变它?

第二个问题是,我是在使用好的方法还是存在更好的方法来完成我想做的事情?也许通过应用设计模式?


示例代码

调用者代码:

    public int X { get { return 800; } }
public int Y { get { return 600; } }

public interface IScreenForm
{
Form FormComponent { get; }
}

public interface IFormA : IScreenForm
{
TextBox UserTextBox { get; } // For use
}

public void LoadForm<T>()
where T:IScreenForm
{
if (!typeof(T).IsInterface)
{
throw new ArgumentException(typeof(T).Name + " is not an interface");
}

Assembly screenAssembly;
string screenResolutionDll = string.Format("{0}_{1}_screens.dll", this.X, this.Y);

screenAssembly = Assembly.LoadFrom(screenResolutionDll);

Type formType = screenAssembly.GetTypes()
.FirstOrDefault(t => t.GetInterfaces().Where(i => i.Name == typeof(T).Name).Count() > 0);

if (formType != null)
{
Form form = (Form)formType.GetConstructor(new Type[] { }).Invoke(null);
if (form != null)
{
form.Show();
}
else
{
throw new ArgumentException("Form doesn't provide a new() ctor");
}
}
else
{
throw new ArgumentException("Any form doesn't implement the interface : " + typeof(T).Name);
}
}

屏幕动态链接库:

public partial class MyFirstForm : Form, caller.IFormA
{
public Form1()
{
InitializeComponent();
}

/* caller.IFormA interface implementation */
}

最佳答案

Arnaud,根据我自己的经验、阅读以及与经验丰富的开发人员的交谈:在支持多种屏幕尺寸和本地化方面,没有 Elixir 。对于本地化,将所有字符串放在资源文件中,甚至放在数据文件中。

就屏幕尺寸而言,我不会想得太聪明。是的,确保您的业务/非 GUI 逻辑都没有被复制,但复制资源文件、表单等——我不会担心。一些 GUI 框架,如 Qt 和 GTK 自动调整大小和自动定位 GUI 小部件(例如 Qt 有“间隔”小部件)。大多数时候它工作正常,但我仍然更喜欢显式控制。使用 GUI 编程时,经常会出现意想不到的故障,拥有三套独立的 GUI 组件将使您能够在它们出现时解决它们。问题的一些示例来源:1)字体大小。2) Windows辅助功能设置。3) 一些国家语言的平均单词比其他语言长,长单词很难适应可用的空间。

如果我处在你的位置,我会看看浏览器如何处理这个问题(例如移动版与桌面版),并且我会尝试在 Web 上找到一些实用的建议(比如这里的 SO)。我怀疑有关设计模式的书籍对此有多大帮助。免责声明:我是一个设计模式怀疑论者。

关于C# - 将 UI 与业务代码分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com