Этот тип ошибок (ModuleNotFoundError
) обычно возникает из-за того, что в вашей системе установлены различные версии Python. Если у вас установлены Python 2 и 3, используйте pip2
или pip3
для установки вашего модуля.
pip2 install openpyxl # for python2
pip3 install openpyxl # for python3
Прием я нашел использование классом 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>
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;
}
Но startOfFirstLine.GetLineStartPosition(1)
пустой указатель возвратов