绳子神秘地断了
本文关键字: | 更新日期: 2023-09-27 18:13:56
在我的应用程序中,我使用WpfLocalization在应用程序运行时提供翻译。库将基本上维护一个属性及其分配的本地化关键字的列表,并在活动语言更改时使用DependencyObject.SetValue()
更新其值。
我注意到我的问题的场景是:我有一个简单的TextBlock
,并为其Text
属性分配了一个本地化关键字。现在,当我的应用程序启动时,它会将初始值写入其中,并且在屏幕上显示得很好。现在我切换语言,新值被设置为Text
属性,但实际上只有一半的文本会显示在屏幕上。来回切换语言没有任何效果。第一种语言总是显示得很好,第二种语言被切掉(在单词中间,但总是完整的字符(。
两种语言的相对长度似乎与此无关。在我的测试用例中,工作语言字符串是498字节,被截断的字符串是439字节,在257字节后被截断(。
当我在通过本地化代码更改其值之前检查所述TextBlock
的Text
属性的当前值时,它在任何一种语言中都将始终具有预期值(而不是截断值(。
当通过WPF检查器在运行时检查TextBlock时,它将以第二语言的text属性显示截断的文本。
到目前为止,这对我来说毫无意义。但现在情况有所好转。
原始的WpfLocalization库从标准资源文件中读取本地化的字符串,但我们使用的是修改后的版本,它也可以从Excel文件中读取这些字符串。它通过使用Microsoft OLE DB驱动程序打开一个OleDbConnection
并通过它读取字符串来实现这一点。在调试器中,我可以看到所有的值都读得很好。
现在,当一位同事发现"断文"问题的解决方案时,我真的很惊讶。他重新排列了Excel表格中的行。我不认为这有什么关系,但在该文件的两个版本之间切换会对问题产生影响。
这确实有道理,因为Excel的ole db驱动程序必须对列中的数据进行采样,才能为其指定类型,如果是字符串,还必须指定长度。如果它只对低于255个字符阈值的值进行采样,则会得到一个字符串(255(类型和截断的文本,如果它对较长的字符串进行了采样,则它会将其分配为备注列,并允许检索/存储较长的字符串。通过重新排序,您可以更改要采样的行。
如果您使用oledb将SQL Server读取到Excel,您会发现这是一个已知的问题。http://msdn.microsoft.com/en-us/library/ms141683.aspx-由于您使用的是相同的ole db驱动程序,我希望这种情况也适用于您。
来自文档:
截断的文本。当驱动程序确定Excel列包含文本数据,驱动程序选择数据类型(字符串或备忘录(基于其采样的最长值。如果驾驶员没有在它所在的行中发现任何超过255个字符的值示例,它将该列视为255个字符的字符串列备忘录列的。因此,长度超过255个字符的值可能是截断。要在不截断的情况下从备注列导入数据,请必须确保至少一个采样中的备注列行包含的值超过255个字符,或者必须增加由驱动器采样以包括这样的行的行数。你可以通过增加的值来增加采样的行数TypeGuessRows位于HKEY_LOCAL_MACHINE''SOFTWARE''Microsoft''Jet''4.0''Engines''Excel注册表钥匙有关更多信息,请参阅PRB:从Jet 4.0传输数据OLEDB源出现故障w/错误。