首页 > 其他分享 >【WPF】Xaml调用.resx资源文件,多语言翻译

【WPF】Xaml调用.resx资源文件,多语言翻译

时间:2024-02-16 20:23:25浏览次数:21  
标签:resx assembly StringResourcesExtension Language Xaml WPF public string

参考文章:https://blog.csdn.net/u010839204/article/details/103932044

本文在该文章的基础上进行了 “改进”

 这个是基类库,基本处理均在基类库里面完成。须注意 StringResources.resx名字和StringResourcesExtension前部分名字须保持一致。

类 StringResourcesExtension:

namespace Fpi.HandyControl.Language
{
    [MarkupExtensionReturnType(typeof(BindingExpression))]
    public class StringResourcesExtension : MarkupExtension
    {
        /// <summary>
        /// 资源的名称,与资源文件StringResource.resx对应
        /// </summary>
        [ConstructorArgument("key")]
        public string Key
        {
            get;
            set;
        }

        /// <summary>
        /// 获取资源内容
        /// </summary>
        public string Value { get => StringResourcesManager.GetString(this.GetType(), Key); }

        public StringResourcesExtension(string key)
            : this()
        {
            Key = key;
        }

        public StringResourcesExtension()
        {
        }
        /// <summary>
        /// 重写函数
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <returns></returns>
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            Binding binding = new Binding("Value") { Source = this, Mode = BindingMode.OneWay };
            return binding.ProvideValue(serviceProvider);
        }
    }
}

类 StringResourcesManager:

namespace Fpi.HandyControl.Language
{
    public class StringResourcesManager
    {
        /// <summary>
        /// 获取字符串
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static string GetString(Type type, string name)
        {
            ResourceManager resource = null;
            var assembly = type.Assembly;
            if (resourcedic.ContainsKey(assembly))
            {
                resource = resourcedic[assembly];
            }
            else
            {
                string ex = "Extension";
                resource = new ResourceManager(type.FullName.Substring(0, type.FullName.Length - ex.Length), assembly);
                resourcedic.Add(assembly, resource);
            }
            return resource.GetString(name, CultureInfo);
        }

        private static Dictionary<Assembly, ResourceManager> resourcedic = new Dictionary<Assembly, ResourceManager>();
    }

基类库完成后,开始写应用库

 同样StringResources.resx名字和StringResourcesExtension前部分名字要一致

此时多语言文件对应的文件夹下建一个StringResourcesExtension类即可

namespace HandyControlTest.Language
{
    public class StringResourcesExtension : Fpi.HandyControl.Language.StringResourcesExtension
    {
        public StringResourcesExtension() : base() { }
        public StringResourcesExtension(string key) : base(key) { }
    }
}

类里面不需要写什么代码就继承一下,构造函数加一下,就可以了。目前暂时没想到如何把这一个类省略掉的方法。

xaml中调用:

 xmlns:lang="clr-namespace:HandyControlTest.Language"
 xmlns:lang1="clr-namespace:Fpi.HandyControl.Language;assembly=Fpi.HandyControl"
<Button Name="btntest2" Content="{lang:StringResources Test}" Width="100" Height="35"  Grid.Row="2" Grid.Column="1"></Button>
<Button Name="btntest1" Content="{lang1:StringResources Test}" Width="100" Height="35" Grid.Row="4" Grid.Column="1"></Button>  

试了基类库和应用库两个都可以直接用,后续每增加一个应用类库,只要建个文件夹,创建一个类继承一下就可以了,无需增加额外代码。

 

标签:resx,assembly,StringResourcesExtension,Language,Xaml,WPF,public,string
From: https://www.cnblogs.com/mqxs/p/18017436

相关文章

  • WPF新境界:MVVM设计模式解析与实战,构建清晰可维护的用户界面
     概述:MVVM是一种在WPF开发中广泛应用的设计模式,通过将应用程序分为模型、视图、和视图模型,实现了解耦、提高可维护性的目标。典型应用示例展示了如何通过XAML、ViewModel和数据绑定创建清晰、可测试的用户界面。什么是MVVM?MVVM(Model-View-ViewModel)是一种用于构建用户界面的......
  • 【转】【WPF】HandyControl调整样式色系
    资源引用以案例项目App.xaml作为系统资源入口,存在如下关系App.xaml:<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary><ResourceDictionary.......
  • 【C#】【WPF】WPF开源控件库HandyControl应用
    1、首先使用nuget包管理器下载handycontrol 2、app.xaml里面引用,这样可以使用里面的样式<Applicationx:Class="HandyControlTest.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microso......
  • WPF中值转换器的使用
    什么是值转换器在WPF(WindowsPresentationFoundation)中,值转换器(ValueConverter)是一种机制,允许你在绑定时转换绑定源和绑定目标之间的值。值转换器实现了IValueConverter接口,该接口包含两个方法:Convert和ConvertBack。这两个方法分别用于在绑定源到目标时进行值转换,以及在目......
  • 【愚公系列】2024年02月 WPF控件专题 Frame控件详解
    ......
  • C#WPF开发电脑进入锁屏状态退出微信的程序
    前因:当电脑登了微信,手机微信通知设置了”windows微信已登录,手机通知关闭“,这个时候手机的系统通知栏不会通知直接原因:我下班回家,个人习惯是直接锁屏不关机,经常忘记退出微信,然后导致回到家接收不到微信通知,漏掉很多朋友的消息结果:所以想开发一个程序,当我电脑锁屏后直接关掉微信,让......
  • 使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序
    对于在线客服与营销系统,客服端指的是后台提供服务的客服或营销人员,他们使用客服程序在后台观察网站的被访情况,开展营销活动或提供客户服务。在本篇文章中,我将详细介绍如何通过WPF+Chrome内核的方式实现复合客服端应用程序。先看实现效果客服程序界面中的聊天记录部分、文字......
  • 4.WPF样式使用规范
    在Web开发的时候,编写css样式的时候通常是统一写在.css样式文件中。在WPF中也可以使用这样的思想。样式引用:1.新建一个项目用于统一存放样式WPF.UI添加一个资源字典Button.xaml或者CheckBox.xaml等等....<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/......
  • 【愚公系列】2024年02月 WPF控件专题 Groupbox控件详解
    ......
  • WPF Prism,mvvm模式下,DataGrid中一列CheckBox的勾选的绑定
    背景WPF+Prism,View和ViewModel,通过Binding来实现数据的更新和界面的刷新,我的需求是做一个表格,第一列为CheckBox,同时这一列的header也是CheckBox,勾选了header的CheckBox,可以实现所有行的CheckBox全选的功能界面如下:实现方法xaml代码:<DataGridx:Name="dgRoundRobin"......