基本上在我的应用程序中,我有一个RichEditBox需要将其数据保存在TextChanged事件中并从保存的设置OnLoaded事件中加载文本,经过数周的实验,我能够在一个最小的应用程序中重现该问题供你们测试。
目标:最终,无论我使用深色或浅色主题将 RTF 文本保存在此丰富的编辑框中,无论何时以任何主题再次加载它都应在深色和浅色主题中显示正确的文本颜色。并且在运行应用程序期间,如果用户更改其设备的主题,文本颜色也应按预期更改。我不确定如何在此处保存 rtf 文本,它可能会忽略文本颜色?
在这里重现错误:https ://github.com/touseefbsb/RichEditBoxColorBug
- 确保您的设备主题为“黑暗”。
- 运行应用程序并将一些文本添加到 RichEditBox 中(顶部的文本块和按钮只是为了确保应用程序在页面加载时不会自动聚焦在richeditbox 上)。
- 单击屏幕上的其他位置以从richeditbox 中释放焦点,然后关闭应用程序。
- 再次运行应用程序,您会注意到之前输入的文本已经按预期出现,现在关闭应用程序。
- 将您设备的主题设置为“Light”并再次运行应用程序,现在您会注意到richeditbox 似乎是空的。
- 但实际上它不是空的,问题是文本颜色是白色的,就像richeditbox的颜色一样,而文本颜色在浅色主题中应该是黑色的。这可以通过用光标选择文本并注意突出显示的文本来证明。
笔记
每次您更改某些内容并尝试再次测试整个流程时,只需确保更改Loaded和TextChanged事件中的键 字符串,以确保保存并稍后加载全新的RTF值,加载和文本更改事件中的键必须始终匹配,并且每次您想从第 1 步开始时都应更改。
代码
Xaml
<StackPanel>
<TextBlock>abc</TextBlock>
<Button>abc</Button>
<RichEditBox
x:Name="REB"
Height="60"
AcceptsReturn="True"
BorderThickness="0"
Loaded="REB_Loaded"
PlaceholderText="placeholder."
TextChanged="REB_TextChanged"
TextWrapping="Wrap" />
</StackPanel>
代码背后
private void REB_Loaded(object sender, RoutedEventArgs e)
{
var localSettings = ApplicationData.Current.LocalSettings;
var localValue = localSettings.Values["ts5"] as string; // Change the key value on every new test
var text = string.IsNullOrEmpty(localValue) ? string.Empty : localValue;
REB.Document.SetText(TextSetOptions.FormatRtf, text);
}
private void REB_TextChanged(object sender, RoutedEventArgs e)
{
var localSettings = ApplicationData.Current.LocalSettings;
REB.Document.GetText(TextGetOptions.FormatRtf, out var tmpNar);
if (!string.IsNullOrEmpty(tmpNar) && !string.IsNullOrWhiteSpace(tmpNar))
{
localSettings.Values["ts5"] = tmpNar; // Change the key value on every new test
}
}
杂项信息
Windows 10 设备版本:1903
项目目标和最小 sdk 版本:1903