Вставьте пробел произвольной ширины в FlowDocument

Есть ли способ вставить пробел заданной ширины в FlowDocument как Inline ? Так что я могу «отступить» некоторые другие Inline, как я хочу.

Если бы можно было поместить некоторую строчку на некотором смещении x в строке, это также решило бы проблему.

ПРИМЕЧАНИЕ: целью этого будет частичное решение проблемы, описанной в этот вопрос.


person Rasto    schedule 26.04.2011    source источник


Ответы (2)


Вы можете использовать классы контейнеров, например:

<RichTextBox>
    <FlowDocument>
        <Paragraph>
            <InlineUIContainer>
                <FrameworkElement Width="200"/>
            </InlineUIContainer>
            <Run x:Name="RunChan" Text="Indented Text"/>
        </Paragraph>
    </FlowDocument>
</RichTextBox>

Я бы не очень рекомендовал это, хотя.


В текстовом блоке:

<TextBlock>
    <InlineUIContainer>
        <FrameworkElement Width="200"/>
    </InlineUIContainer>
    <Run x:Name="RunChan" Text="Indented Text"/>
</TextBlock>
person H.B.    schedule 26.04.2011
comment
Здесь 2 проблемы: сначала Run, содержащий текст Blah blah blah, может быть перенесен на следующую строку, и в этом случае у меня будет пустая белая строка. Второй <InlineUIContainer> не поддерживается TextBlock (я все еще могу использовать его с FlowDocument). - person Rasto; 27.04.2011
comment
Мои текстовые блоки поддерживают это (добавлено в ответ) - person H.B.; 27.04.2011
comment
Х.Б.: Тогда я был неправ... Почему бы вам не порекомендовать его? Я знаю, что это неясно, но у вас есть какая-то конкретная причина? Можете ли вы найти лучшее решение в контексте этот вопрос (пробел предназначен для отступа аккордов, чтобы они появлялись над правильным символом текста) ? - person Rasto; 27.04.2011
comment
Мне это не нравится, потому что я считаю немного хаком вставлять фиктивный элемент управления для интервала. Если бы в вашем распоряжении были блоки, вы могли бы использовать их свойство Margin, жаль, что у встроенных строк этого нет. Кстати, синтаксис ссылки на комментарий можно узнать, нажав кнопку справки при создании комментария. - person H.B.; 27.04.2011
comment
Х.Б.: Я удивляюсь, почему у них нет маржинальной собственности? Как вы думаете, я могу создать подкласс Inline, чтобы создать что-то вроде класса SpanWithMargin? Мне нужно было бы иметь возможность влиять на то, как укладываются Inline, чтобы сделать это. Или, по крайней мере, контролировать, сколько места они занимают. Добавить ссылку: я исправил ссылку, мне пришлось искать синтаксис, я никогда раньше не упоминал ссылку на справку. - person Rasto; 27.04.2011
comment
Раньше я пробовал создавать подклассы встроенных строк, это не очень хорошо получалось, так как я понятия не имел, что я должен делать. Вы можете попробовать, но я не могу вам помочь. - person H.B.; 27.04.2011
comment
Х.Б.: Я не совсем понимаю ваш последний комментарий. Вы пытались создать подкласс Inline, чтобы дать ответ на мой вопрос, но вам это не удалось, потому что вы не знали, чего я от него хочу? Или вы пытались создать подкласс Inline раньше по какой-то другой причине, но вам это не удалось, потому что вы не знали, как его создать? - person Rasto; 27.04.2011
comment
Последнее, я не знал, как правильно разделить его на подклассы. - person H.B.; 27.04.2011
comment
@драсто Х.Б. , лучший ответ, который вы получите, и я действительно не считаю это взломом. Это просто то, что есть: встроенный пробел с определенной шириной. С этим вы получите все, что вы просите. Если перенос был для вас проблемой, просто предотвратите перенос, но тогда у вас будут длинные очереди. если вы хотите, чтобы весь абзац был с отступом, сделайте как H.B. предложено: используйте Margin. - person Markus Hütter; 01.05.2011

Я не уверен, решит ли это вашу проблему, но если вы хотите «сделать отступ» для встроенного элемента, возможно, вы можете вставить небольшой плавающий элемент или рисунок размером с то, что вам нужно. Убедитесь, что Floater короткий, чтобы он не занимал более одной строки.

Я ищу что-то более элегантное, чем это, но пока это работает на меня.

person Kevin Hsu    schedule 26.04.2011
comment
Ну это вариант, но не очень понятный... И непонятные решения тают по глючному. Если я использую Figure, а не Floater, он не может переходить на следующую строку, верно? Ну, если вы найдете что-то полезное или получите какие-либо идеи, пожалуйста, дайте мне знать. Здесь вы также найдете мои достижения. Было бы здорово, если бы в классе Span было что-то вроде свойства MinimumXOffset. Или если бы был способ создать подкласс и реализовать такое свойство. - person Rasto; 27.04.2011
comment
Подойдет — мое большое пожелание — чтобы Microsoft формализовала и показала, как форматируются элементы FlowDocument, чтобы мы могли реализовывать наши собственные встроенные строки и блоки так же, как мы создаем собственные элементы FrameworkElements. - person Kevin Hsu; 27.04.2011
comment
Значит, теперь мы не можем реализовать свои собственные Inline? Или мы просто не знаем, как это сделать, потому что это задокументировано? Я думал, что создание собственного Inline — единственный выход из этого встроенного ада... - person Rasto; 27.04.2011
comment
Не уверен, но я думаю, что поведение рендеринга специфично для набора классов FlowDocument. Другими словами, визуализатор FlowDocument, кажется, интерпретирует, как визуализировать элементы с помощью своего собственного кода, а не откладывает его на код внутри элементов. Если вы используете Reflector для некоторых элементов, они не содержат ничего в плане фактического форматирования. - person Kevin Hsu; 28.04.2011