Вопрос WPF richTextBox

Этот тип ошибок (ModuleNotFoundError) обычно возникает из-за того, что в вашей системе установлены различные версии Python. Если у вас установлены Python 2 и 3, используйте pip2 или pip3 для установки вашего модуля.

pip2 install openpyxl  # for python2
pip3 install openpyxl  # for python3
6
задан Bob Kerlinger 20 November 2008 в 20:09
поделиться

3 ответа

Прием я нашел использование классом TextPointer и его методом GetCharacterRec.

RichTextBox содержит FlowDocument. Текст в документах потока содержится в объекте Выполнения (бит упрощения, но это работает). Код находит TextPointer в начале первого показа. Это затем получает ограничительный прямоугольник того первого символа. Затем код обходит вперед один символ за один раз, получает новый ограничительный прямоугольник и проверяет, отличается ли нижняя часть нового прямоугольника от исходного прямоугольника. Если нижняя часть отличается затем, мы находимся на новой строке. TextPointer может затем получить текст или прежде или после повреждения.

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void inspect(object sender, RoutedEventArgs e)
    {
        TextPointer pointer = FindRun(inBox.Document);

        string textAfterBreak = FindBreak(pointer);

        outBox.Text = textAfterBreak;
    }

    private string FindBreak(TextPointer pointer)
    {
        Rect rectAtStart = pointer.GetCharacterRect(LogicalDirection.Forward);

        pointer = pointer.GetNextInsertionPosition(LogicalDirection.Forward);
        Rect currentRect = pointer.GetCharacterRect(LogicalDirection.Forward);

        while (currentRect.Bottom == rectAtStart.Bottom)
        {
            pointer = pointer.GetNextInsertionPosition(LogicalDirection.Forward);
            currentRect = pointer.GetCharacterRect(LogicalDirection.Forward);
        }

        string textBeforeBreak = pointer.GetTextInRun(LogicalDirection.Backward);
        string textAfterBreak = pointer.GetTextInRun(LogicalDirection.Forward);

        return textAfterBreak;
    }

    private TextPointer FindRun(FlowDocument document)
    {
        TextPointer position = document.ContentStart;

        while (position != null)
        {
            if (position.Parent is Run)
                break;

            position = position.GetNextContextPosition(LogicalDirection.Forward);
        }

        return position;
    }
}

<Window x:Class="LineBreaker.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <RichTextBox Grid.Row="0" Name="inBox">
        </RichTextBox>
        <Button Grid.Row="1" Click="inspect">Find Break</Button>
        <TextBox Name="outBox" Grid.Row="2"/>
    </Grid>
</Window>
2
ответ дан 17 December 2019 в 07:10
поделиться

http://msdn.microsoft.com/en-us/library/system.windows.documents.textpointer.getlinestartposition.aspx

TextPointer startOfFirstLine = richTextBox.Document.ContentStart;
TextPointer startOfNextLine = startOfFirstLine.GetLineStartPosition(1);
if(startOfNextLine != null)
{
     // At this point what you do with the TextPointer depends on what you define as the position of text.
     // If you want to find out how many characters are on the first line ...
    int firstLineCharacterCount = new TextRange(startOfFirstLine, startOfNextLine).Text.Length;
}
1
ответ дан 17 December 2019 в 07:10
поделиться

Но startOfFirstLine.GetLineStartPosition(1) пустой указатель возвратов

1
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

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