【发布时间】:2021-04-16 11:07:08
【问题描述】:
基本上在我的应用程序中,我有一个 RichEditBox 需要在 TextChanged 事件中保存其数据并从保存的设置中加载文本 OnLoaded事件,经过数周的实验,我能够在一个最小的应用程序中重现该问题供你们测试。
目标:最终,无论我使用深色或浅色主题将 RTF 文本保存在这个丰富的编辑框中,无论何时以任何主题再次加载它都应该在深色中显示正确的文本颜色和轻主题。并且在运行应用程序期间,如果用户更改其设备的主题,文本颜色也应按预期更改。我不确定如何在此处保存 rtf 文本,它可能会忽略文本颜色?
在此处重现错误:https://github.com/touseefbsb/RichEditBoxColorBug
- 确保您的设备主题设置为“深色”。
- 运行应用程序并将一些文本添加到 RichEditBox 中(顶部的文本块和按钮只是为了确保应用程序在页面加载时不会自动聚焦在richeditbox 上)。
- 单击屏幕上的其他位置以从 Richeditbox 中释放焦点,然后关闭应用程序。
- 再次运行应用程序,您会发现之前输入的文本已按预期出现,现在关闭应用程序。
- 将您的设备的主题设置为“Light”并再次运行应用程序,现在您会发现richeditbox 似乎是空的。
- 但实际上它不是空的,问题是文本颜色是白色的,就像richeditbox的颜色一样,而文本颜色在浅色主题中应该是黑色的。这可以通过用光标选择文本并注意突出显示的文本来证明。
注意
每次您更改某些内容并尝试再次测试整个流程时,只需确保更改 key 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
}
}
MISC 信息
Windows 10 设备版本:1903
项目目标和最小 sdk 版本:1903
【问题讨论】:
标签: c# text uwp themes richeditbox