关于Convert的转换器的工功能介绍:
在 WPF 中,Converter 通常用于在数据绑定过程中执行值的转换。你可以创建自定义的 Converter 类来实现数据的转换逻辑,然后在 XAML 中使用这个转换器。
创建一个继承自 ValueConverter接口的转换器类,实现 Convert 和 ConvertBack 方法。
以下是两个方法的操作的明细说明:
// 创建一个继承自 IValueConverter 接口的转换器类
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// 在这个方法中编写你的值的转换逻辑
// value 参数表示绑定的值
// targetType 参数表示目标属性的类型
// parameter 参数表示传递的参数
// culture 参数表示本地化信息
// 返回转换后的值
// 例如:将绑定的值转换为字符串并返回
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// 如果需要实现值的双向转换,可以在这个方法中编写逻辑
// 例如:将字符串值转换为特定类型的值并返回
return System.Convert.ChangeType(value, targetType);
}
}
在 XAML 中,声明 Converter,并将它应用到数据绑定中
<Window.Resources>
<local:MyConverter x:Key="myConverter" /> <!-- 声明 Converter -->
</Window.Resources>
...
<TextBlock Text="{Binding MyValue, Converter={StaticResource myConverter}}" />
数据绑定时,值会先经过 Converter 的转换逻辑,然后再显示在 TextBlock
另外 关于字符矢量图的一部分说明:操作软件:FontCreator
在xaml下面与后台系统识别的UNCOde数据是不一样的,所以需要中间转换 在XAML下识别的数据是
首先$后面的额数据都是一样的:
在XAML下应该是识别是"Content= “后面可以是其他字符
",其中原因是:XAML下不能识别 “\
” 需要使用"&#
"来进行转义,所以实际起作用的是 “xe627”;也就是原来的数据为\xe627
后台输入的方法 则不同,方式是’This.BT.Tag = "\ue627
’;
其中 使用转换的方法是:
/// <summary>
/// Unicode 转 字符串
/// </summary>
/// <param name="unicodeStr"></param>
/// <returns></returns>
public string UnicodeToStr(string unicodeStr)
{
string outStr = "";
if (!string.IsNullOrEmpty(unicodeStr))
{
string[] strlist = unicodeStr.Replace("&#", "").Replace(";", "").Split('x');
try
{
for (int i = 1; i < strlist.Length; i++)
{
outStr += (char)int.Parse(strlist[i], System.Globalization.NumberStyles.HexNumber);
}
}
catch (FormatException ex)
{
outStr = ex.Message;
}
}
return outStr;
}
针对当前这个转换器的操作是:
[ValueConversion(typeof(int), typeof(String))]
public class ICOConverter : IValueConverter
{
/// <summary>
/// 将Unicode编码转换为汉字字符串
/// </summary>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = System.Convert.ToString(value);
string un = string.Empty;
MatchCollection mc = Regex.Matches(str, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);//这个正则要求要有两个"\\"
byte[] bts = new byte[2];
foreach (Match m in mc)
{
bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);
bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
un += Encoding.Unicode.GetString(bts);
}
return un;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
所以在指定规则返回数据的时候需要 加入两个"\\
"这个正则才能识别的到。
故需要绑定数据时间:
ThisModel thisModelone = new ThisModel();
thisModelone.ThisICON = "\\ue627";
thisModelone.ThisSetName = "测试";
ThisTest.DataContext = thisModelone;
写在对应的XAML下才能识别为:
<Window.Resources>
<ResourceDictionary>
<Converters:ICOConverter x:Key="sefg"/>//引入
</ResourceDictionary>
</Window.Resources>
<Button Name="ThisTestBT" Grid.Column="1" Tag="{Binding ThisICON,Converter={StaticResource sefg}}" Style="{DynamicResource NormalButton}" Background="Transparent" Foreground="Blue" Click="BTTest_Click" >
测试按钮
</Button>//使用
就可以得到结果
另一篇关于 js与后端数据出现编码不同的乱码也是一样的道理
在做网页爬虫时难免会遇到编码乱码或需要编码转换的问题Unicode编码、json编码转中文
Unicode编码转中文
private string NormalU2CC(string str)//”string str”指待传入的字符串
{
string r = "";
MatchCollection mc = Regex.Matches(str, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
byte[] bts = new byte[2];
foreach (Match m in mc)
{
bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);
bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
r = Encoding.Unicode.GetString(bts);
Regex regex = new Regex(@"\\u" + m.Groups[1].Value + m.Groups[2].Value, RegexOptions.IgnoreCase);
str = regex.Replace(str, r);
}
return str;
}
json字符串转中文
/// json字符串转中文需要先将编码转换为Unicode编码之后在通过Unicode编码转为中文
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private string JsonToUnicode(string input)
{
input = input.Replace("\\\"", "\"");
input = input.Replace("\\/", "/");
string result;
if (!input.Contains("\\u"))
{
result = input;
}
else
{
StringBuilder stringBuilder = new StringBuilder();
if (input.IndexOf("\\u") > 0)
{
stringBuilder.Append(input.Substring(0, input.IndexOf("\\u")));
input = input.Substring(input.IndexOf("\\u"));
}
if (!string.IsNullOrEmpty(input))
{
string[] array = input.Split(new string[] { "\\u" }, StringSplitOptions.RemoveEmptyEntries);
string[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
string text = array2[i];
if (text.Length > 4)
{
string arg = text.Substring(4);
stringBuilder.Append((char)int.Parse(text.Substring(0, 4), NumberStyles.HexNumber) + arg);
}
else
{
if (text.Length == 4)
{
stringBuilder.Append((char)int.Parse(text, NumberStyles.HexNumber));
}
else
{
if (text.Length < 4 && text.Length > 0)
{
stringBuilder.Append(text);
}
}
}
}
}
result = stringBuilder.ToString();
}
return result;
}
参考文档:https://www.cnblogs.com/Juliet1018/p/7016137.html
也是同一个原因操作