小编use*_*732的帖子

在调用ApplyResources之后重新应用动态添加的UserControl的布局

在一个WinForms应用程序,一个Panel被用作占位符来显示单个用户控制的导航策略:每当用户希望导航到给定的区域,相应的用户控制被添加到面板.简化:

contentPanel.Controls.Clear();
userControl.Dock = DockStyle.Fill;
contentPanel.Controls.Add(userControl);
Run Code Online (Sandbox Code Playgroud)

由于要求不受我的控制,表单必须支持动态切换语言.使用Hans Passant的答案实现并正常工作,并修改使用用户控件的资源管理器,该管理器正确获取并将本地化文本应用于控件.

但是,在应用来自用户控件的相应资源文件的资源之后,DockStyle.Fill由于用户控件的组成控件本身没有设置,因此导致的布局丢失DockStyle.Fill.这具有控制不再拉伸以填充可用区域的效果,并且限于设计器/资源文件中定义的原始大小.请注意,在应用资源后,Dock仍然可以正确设置用户控件的属性DockStyle.Fill.

我创建了一个示例应用程序来说明/重现问题:下面的表单有一个面板,用户控件动态添加到该面板并设置为DockStyle.Fill.用户控件的标签位于默认语言环境的左上角,位于德语语言环境的右上角.我希望表单捕捉标签,该标签固定在表格右边缘的右侧,但用户控件的大小会重置为设计时的值.查看源代码.

如果我在德语区域设置上启动表单,则标签将正确放置在表单的右边缘:

在此输入图像描述

我想要发生的是在调用后保留布局ApplyResources.当然,我可以简单地制作控件LocationSize属性的副本(如上面提到的同一问题的另一个答案所示)但不幸的是,这些属性的值在区域设置之间有所不同.因此,在应用本地化字符串和定位之后,如何指导用户控件重新布局其所有控件?

我试过的

  • 通过观察InitializeComponent(),我已经打过电话PerformLayout()Panel容器,用户控件和表格都无济于事.
  • 添加SuspendLayout()ResumeLayout(true)前后调用ApplyResources后,也没有成功.

其他实施细节

  • 对实例化用户控件的引用保存在主窗体的私有字典中.当引发该控件的导航时,将删除先前的用户控件,并使用上面的代码段添加现有引用.
  • 对用户更改语言的事件做出反应:

    protected virtual void OnChangeCulture(CultureInfo newCulture)
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
        System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture;
    
        SuspendLayout();
        ComponentResourceManager resources = new ComponentResourceManager(this.GetType());
        ApplyResources(resources, this, newCulture);
        ResumeLayout(true);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 将资源应用于表单中的所有控件:

    private void ApplyResources(ComponentResourceManager resourceMgr, …
    Run Code Online (Sandbox Code Playgroud)

c# .net-3.5 winforms

6
推荐指数
1
解决办法
373
查看次数

C#Interop - 释放在非托管代码中分配的内存

我正在调用以下VC++方法

__declspec(dllexport) unsigned char* Get_Version_String()
Run Code Online (Sandbox Code Playgroud)

来自C#如下:

internal static class NativeMethods
{
    [DllImport("my.dll"),
        CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true, 
        CallingConvention = CallingConvention.Cdecl)]
    internal static extern string Get_Version_String();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码位于一个面向.NET 3.5的库中.当我从3.5组装中调用它时,它工作正常; 但是,当从4.5程序集调用它时,它会导致

0xC0000374:堆已损坏

阅读完这个问题之后,我改变了我的方法调用,如下所示:

[DllImport("my.dll",
    EntryPoint = "Get_Version_String",
    CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true, 
    CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr Get_Version_String_PInvoke();

internal static string Get_Version_String()
{
    IntPtr ptr = Get_Version_String_PInvoke();
    string versionString = Marshal.PtrToStringAnsi(ptr);
    return versionString;
}
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但Hans Passant的回答是警告:

您找到的解决方法是正确的,marshaller不会尝试释放内存IntPtr.请注意,如果C代码返回const …

c# interop

5
推荐指数
1
解决办法
1378
查看次数

如何判断 git repo 是否是镜像?

我正在尝试了解 git 镜像。给定一个工作副本,我如何确定它是否是另一个存储库的镜像(或正在镜像)?

干杯。

git

4
推荐指数
2
解决办法
3595
查看次数

如何更改 Windows 中 gitg 的界面语言?

我刚刚在 Windows 7 计算机上从Windows 二进制文件安装了 gitg。即使机器的显示语言设置为英语,gitg 的界面仍以德语区域设置显示。我查看了设置(Einstellungen),但似乎没有与语言相关的特定设置。

我的猜测是,它从 Windows 的“区域和语言”>“位置”>“当前位置”获取区域设置,该区域设置确实设置为德国。如果是这种情况,我会认为这是一个错误,因为这是确定应用程序区域设置的错误设置(在我看来,显示语言将是正确的设置)。

有谁知道我可以在哪里修改应用程序的内部配置,以便我可以强制它以英语显示?

谢谢!

gitg

4
推荐指数
1
解决办法
662
查看次数

标签 统计

c# ×2

.net-3.5 ×1

git ×1

gitg ×1

interop ×1

winforms ×1