Инструмент в wpf для быстрого вывода большой текстовой информации?

Добрый день. Подскажите, пожалуйста, с помощью чего в wpf можно вывести большой текст при этом быстро? и так, чтобы можно было нужные части этого текста форматировать заранее(из кода). Пробовал делать вывод на канвас кучи маленьких текстблоков (с форматированием нужных), но это занимало много времени и памяти. Пробовал один текстблок с кучей Run'еров, тоже долго. Пробовал RichTextBox - Он совсем медленный.. Пробовал канвас с добавлением на него FormattedText (быстро, но нет нужного форматирования, приходилось отрисовывать с абсолютным позиционированием в отдельном слое прямоугольники(как будто у текста есть background), так что все плыло). Пробовал делать на MVC (а вдруг), но там тоже медленновато. Какие инструменты можно еще попробовать?
  • Вопрос задан
  • 1151 просмотр
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
От скуки нарисовал более простое решение - custom panel, которая отображает сетку с ячейками фиксированного размера. Border-ы, Background-ы ячеек - на ваше усмотрение в методах CreateCell и BindCell.

Пробовал 1 млн х 1 млн ячеек - никаких тормозов. Отображается только то, что видно на экране.

59e9ec8d02f32162485723.png
<Window x:Class="GridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:GridTest"
        Title="Square Grid Test" Height="350" Width="525">
    <ScrollViewer CanContentScroll="True" 
                HorizontalScrollBarVisibility="Visible"
                VerticalScrollBarVisibility="Visible">
        <local:SquareGrid x:Name="Grid">
        </local:SquareGrid>
    </ScrollViewer>
</Window>


using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace GridTest
{
    public partial class MainWindow : Window, SquareGrid.ICellGenerator
    {
        public MainWindow()
        {
            InitializeComponent();

            Grid.RowCount = 1000;
            Grid.ColumnCount = 1000;
            Grid.CellWidth = 36;
            Grid.CellGenerator = this;
        }

        public UIElement CreateCell()
        {
            return new Border
            {
                Child = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center,
                    FontSize = 10
                },
                BorderBrush = Brushes.LightGray,
                BorderThickness = new Thickness(0, 0, 1, 1)
            };
        }

        public void BindCell(UIElement view, int x, int y)
        {
            var border = (Border)view;
            var textBlock = (TextBlock)border.Child;
            textBlock.Text = "" + x + ":" + y;
        }
    }
}


public sealed class SquareGrid : Panel, IScrollInfo
{
    // Подробности сюда не влезли,
    // см. SquareGrid.cs
}

SquareGrid.cs

Проект целиком: SquareGrid.zip
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы