- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在搜索如何更改具有 Localizable
的表单的语言属性设置为 true。
https://msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture(v=vs.110).aspx
这个是设置窗体的语言,但是这个需要在我们实例化窗体之前设置。在此事件之后无法调用。
搜索资料,我看到了以下问题:https://stackoverflow.com/a/11738932/3286975但是,正如评论所说,我在 TabControl 和 MenuStrip 中有控件,因此它们不受影响。
我试图通过获取表单的所有控件来修改它,但没有运气。
在此菜单中,我调用了以下回调:
private void englishToolStripMenuItem_Click_1(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
private void spanishToolStripMenuItem_Click(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
我通过使用标签来改变文化。
当我点击它时没有任何反应。此外,我对上述答案中的 ApplyResources 方法进行了一些修改。
private void ApplyResources(Control parent, CultureInfo culture)
{
this.resManager.ApplyResources(parent, parent.Name, culture);
foreach (Control ctl in parent.IterateAllChildren())
{
//this.ApplyResources(ctl, culture);
this.resManager.ApplyResources(ctl, ctl.Name, culture);
}
}
其中 IterateAllChildren 如下:https://stackoverflow.com/a/16725020/3286975
此外,我尝试使用 (System.LINQ):Controls.OfType<Label>()
(因为我有一个标签来测试这个)运气不好......
但是当我选择西类牙语时,没有任何文本发生变化。
所以也许,我对 children 感到失望。或者可能通过调用方法 CreateCulture
,我不知道。
提前致谢!
编辑:
我已经测试过通过 Culture Info 获取我的表单的资源管理器,它每次都返回默认值:
ResourceSet resourceSet = new ResourceManager(typeof(frmCredentials)).GetResourceSet(new CultureInfo(lang), true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value; //resourceSet.GetString(resourceKey);
if (resource.GetType().Equals(typeof(string)))
Console.WriteLine("Key: {0}\nValue: {1}\n\n", resourceKey, (string) resource);
}
在哪里new CultureInfo(lang)
,我也测试过:new CultureInfo("es")
& Thread.CurrentThread.CurrentCulture
(CurrentUICulture) 没有运气。就像它从不存在或被替换,但在我的设计和文件资源管理器中我可以看到这些文件。
编辑 2:
可能是因为我正在使用 ILMerge 将所有 dll 合并到一个唯一的 dll 中。我正在审查这个:Single-assembly multi-language Windows Forms deployment (ILMerge and satellite assemblies / localization) - possible?
回复EDIT2:
是的,删除ILMerge问题解决了,我给出的第一个解决方案解决了这个问题。但由于某种原因,西类牙语被用作默认语言,当我尝试从中获取资源集时,它没有返回任何内容。
此外,我已将 Localizable 属性设置为 false,并且它没有创建带有值的默认 resx 文件。我不知道这是否是一个好习惯。
我会尝试一些新的东西...
最佳答案
MVVM(模型 - View - ViewModel)方法有一些好处,对您的情况很有用。
为您将用于本地化的语言创建新的资源文件。使用表单自己的资源文件可能有点棘手,因为每次您在设计器中进行更改时它都会重新生成 - 所以我认为自己的资源文件将更容易维护,甚至与其他表单甚至项目共享。
LocalizationValues.resx // (default english), set Access Modifier to "Internal" or "Public"
"Title": "Title"
"Description": "Description"
LocalizationValues.es.resx
"Title": "Título"
"Description": "Descripción"
Visual Studio 生成静态类 LocalizationValues
,并将属性作为 .resx 文件的键。所以“Title”可以作为 LocalizationValues.Title
创建代表您在本地化中使用的所有文本的“viewmodel”类。类应实现 INotifyPropertyChanged
接口(interface)。
public class LocalizationViewModel : INotifyPropertyChanged
{
public string Title
{
get
{
return LocalizationValues.Title;
}
}
public string Description
{
get
{
return LocalizationValues.Description;
}
}
public void SetLanguage(string language)
{
var culture = new CultureInfo(language);
Thread.CurrentThread.CurrentUICulture = culture;
// This is important,
// By raising PropertyChanged you notify Form to update bounded controls
NotifyAllPropertyChanged();
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyAllPropertyChanged()
{
// Passing empty string as propertyName
// will indicate that all properties of viewmodel have changed
NotifyPropertyChanged(string.Empty);
}
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
然后在Form中将viewmodel绑定(bind)到控件上
public partial class YourForm : Form
{
private LocalizationViewModel _viewmodel;
public YourForm()
{
InitializeComponent();
_viewmodel = new LocalizationViewModel();
// Bound controls to correspondent viewmodel's properties
LblTitle.DataBindings.Add("Text", _viewmodel, "Title", true);
LblDescription.DataBindings.Add("Text", _viewmodel, "Description", true);
}
// Menu buttons to change language
private void SpanishToolStripMenuItem_Click(object sender, EventArgs e)
{
_viewmodel.SetLanguage("es");
}
private void EnglishToolStripMenuItem_Click(object sender, EventArgs e)
{
_viewmodel.SetLanguage("en");
}
}
上述方法将提供比仅更新控件更多的好处。您可以清楚地分离应用程序的各个部分,这些部分可以相互独立地进行测试。
关于c# - 在 WinForms 中以可本地化的形式在运行时更改 CurrentUICulture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46007638/
我有一个 winform 应用程序和一个可观察的设置,如下所示: Form form = new Form(); Label lb = new Label(); form.Controls.Add(l
在 Windows 窗体中实现多项选择选项的最佳方法是什么?我想从列表中强制执行单个选择,从默认值开始。 看起来 ComboBox 是一个不错的选择,但是有没有办法指定一个非空白的默认值? 我可以在代
如何在 WinForm 应用程序中保护我的 ConnectionString? 最佳答案 你不能。尽管您可以在 app.config 文件中加密连接字符串,但应用程序需要能够解密它,因此,始终可以检索
有谁知道像 DotNetBar 那样的 Winforms 面包屑样式导航。 http://www.devcomponents.com/dotnetbar/BreadCrumbHorizontalTre
我正在寻找在 Windows 窗体 C# 中实现多选启用列表框的方法。 有什么建议? 谢谢。 最佳答案 只需添加一个 ListBox控制和设置属性:SelectionMode = SelectionM
我有一个简单的 WinForms 应用程序,用于输入测试用例。自从我将此应用程序升级到 .NET 4.0 并将新的标签页添加到标签页控件以根据 XSD 架构验证 XML 以来,该应用程序一直随机崩溃。
在老式的 MFC 中,DDX 例程内置了表单条目的验证。例如,可以自动检查用户是否在用于数字输入的文本框中输入了字符串。 Winforms中有这样的机制吗?显然,可以为“onChange”等类型的事件
我主要具有 ASP.Net 背景,并具有一些 MVC 知识。我也做了一些 Silverlight 和 MVVM,但是我现在即将转向 Winforms,我对它的经验很少,所以我想知道如何处理 MVP。
简单的问题,虽然办公室里似乎没有人知道,而且我找不到一个好的方法来问谷歌这个问题。在 winforms 中,如果您有一个处理事件的函数(在本例中是在 focusLost 上),那么该函数是否与触发该事
在 Winform 中,我有一个组框,其中有几个文本框控件。如果我删除组框,文本框也会被删除。它们以某种方式与 Groupbox 联系在一起,尽管我没有故意做任何事情来实现这种情况。问题 - 如何删除
我可以在哈希表中设置表单元素: $Hash = @{} $Hash.Main = New-Object System.Windows.Forms.Form $Hash.Main.Left = 0 $H
我是 Windows 开发新手。我开发了一个 WinForm 应用程序,它与串行设备通信并在图表上绘制数据。该应用程序应每天 7/7 24 小时运行。代码执行正确,但执行几个小时后,UI 卡住,操作系
有没有办法记录 Win Forms 应用程序中的所有点击?我想拦截点击并记录该操作以及导致该操作的控件的名称。 这可能吗? 提前致谢。 更新:我正在寻找一个应用程序范围的解决方案,是否没有办法将监听器
我不知道这是否会影响其他控件,但对于列表框和选中列表框,列表框的底部仅以一定的间隔随表单调整大小。 假设我有一个表单和一个列表框,该列表框与表单边缘的所有边都有 2px 间隙,并锚定在所有四个边上。现
我在大多数 WinForms 控件的设计 View 中看到“Tag”属性。我从未使用过此标签,并且想知道为什么我要使用它。 最佳答案 它允许您使用控件存储一些自己的数据。它在树控件中最有用,您可能希望
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
如果有,有人吗?鱼眼 (菜单/ Pane )窗体在 Ajax 应用程序中常见的控件: 例如:http://interface.eyecon.ro/demos/fisheye.html 用 google
这是 Determine Label Size based upon amount of text and font size in Winforms/C# 的倒数. 给定一个高度固定但宽度可变的矩形
我们公司正在研究为我们的开发团队采购 22"显示器。当前唯一的问题是我们的用户将使用较小的屏幕。 我们尝试使用屏幕网格工具(gridmove 和 nvidia 的 utils),但它们并不完全现实。
我有一个 winforms 应用程序,它在网络服务请求期间被锁定 我已经尝试使用 doEvents 来保持应用程序解锁,但它仍然不够响应, 我怎样才能绕过这个锁定,让应用程序始终响应? 最佳答案 最好
我是一名优秀的程序员,十分优秀!