RichTextBlock скрывает свой контент при программном обновлении, дважды - PullRequest
0 голосов
/ 05 декабря 2018

Работая над небольшим приложением UWP, которое отображает форматированный текст и обновляет его части в зависимости от изменений модели, я наткнулся на действительно странную ошибку RichTextBlock.Я был бы признателен, если бы кто-то смог дать представление об этой RichTextBlock особенности или дать идею по ее устранению.

Вот упрощенный код воспроизведения и пример использования ошибки:

  • RichTextBlock с обновленным кодом контента работает нормально, пока пользователь не нажмет на него.После щелчка отображается еще одно изменение, но при втором изменении содержимое становится скрытым.

  • После этого, если пользователь выбирает что-то в невидимом тексте или нажимает Ctr + A, то RichTextBlock будет повторно отображать его содержимое, но после 2-го изменения текста содержимое снова станет скрытым.

  • Что любопытно, при использовании кнопки «Ничего не делать» содержимое постоянно появляется,хотя нажатие на RichTextBlock еще раз заставляет его исчезнуть снова.

<Page
    x:Class="RichTextBlockTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Viewbox>
        <StackPanel Spacing="8" Margin="4">
            <RichTextBlock FontSize="24">
                <Paragraph>
                    <Run x:Name="timeRun">{ Time is Now }</Run>
                </Paragraph>
            </RichTextBlock>
            <Button HorizontalAlignment="Stretch">Do Nothing</Button>
        </StackPanel>
    </Viewbox>
</Page>
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace RichTextBlockTest
{
    public sealed partial class MainPage : Page
    {
        private DispatcherTimer timer =
            new DispatcherTimer { Interval = new TimeSpan(0, 0, 1) };

        public MainPage()
        {
            InitializeComponent();
            timer.Tick += (o, e) =>
            {
                timeRun.Text = DateTime.Now.ToString("HH:mm:ss");
            };
            timer.Start();
        }
    }
}

Помимо вышеизложенного, я пробовал этот сценарий с привязкой, DependencyProperty, {x:Bind}, а также с воссозданием Run и Paragraph там вместо прямого изменения Run.Text из кода - все с тем же результатом.

  • Проект ориентирован на Windows 10, версия 1803 (10.0; сборка 17134)
  • Подтверждена эта ошибка на 2-х компьютерах под управлением Win 10 Pro 1803 - разработка и другой чистый тестовый компьютер.
  • Обратите внимание, что Windows 10 Pro 1809 и сборка сервера1809не показывать эту ошибку (проект все еще был нацелен на 1803 при тестировании).Существуют некоторые странности того, как RichTextBlock отображает текст, когда пользователь выбирает его часть, в то время как текст изменяется, включая временное исчезновение, похожее на ошибку выше, но в 1809 году а) исчезновение не является постоянным и требует не просто щелчка, а выборав процессе, б) это серая область, как элемент управления должен вести себя, если выбранный пользователем текст был изменен приложением в середине полета, и в) есть простые и логичные обходные пути, например, приостановка автоматического изменения текстаесли пользователь пытается что-то выбрать.

Обновление 2018-12-11

  • VS.Net был обновлен до 15.9.4, что также требовало проектов с переходом на 1803 (!)Microsoft.NETCore.UniversalWindowsPlatform версия с 6.2.2 до 6.1.9.Ошибка все еще воспроизводима в Windows 10 Pro 1803.
...