Как обернуть свободный текст в панель стека - PullRequest
0 голосов
/ 25 июня 2018

Я знаю, что если вы введете:

<StackPanel>
    Here is some text. It doesn't wrap.
</StackPanel>

XAML обернет текст в TextBlock, а затем отобразит новый текстовый блок в StackPanel.Тем не менее, TextBlock по умолчанию не выполняет перенос текста - вы должны специально указать это.

Так что я попытался указать его для переноса, неявно стилизовав его:

<StackPanel>
    <StackPanel.Resources>
        <ResourceDictionary>
            <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
                <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
        </ResourceDicionary>
    <StackPanel.Resources>
    Here is some reeeeeeaaaaally long text that is hopefully going to wrap.
</StackPanel>

Но этоне сработало.

Google рекомендует поместить текст в текстовый блок вручную следующим образом:

<StackPanel>
    <TextBlock TextWrapping="Wrap" Text="Here is some manual Text"/>
</StackPanel>

Но мне нравится более простой синтаксис первого варианта - должен быть способ сказать этообернуть!Есть идеи?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Спасибо @Erno de Weerd - зная, что StackPanels не может добавить текст, я сразу выбрал правильный путь.

Я упростил свою проблему до крайности. В действительности у меня был ItemsControl со StackPanel, так как это ItemsPanelTemplate. Те могут принимать текст напрямую, потому что они помещают свои данные в ContentControl, прежде чем помещать их в ItemsPanelTemplate. Я переопределил функцию PrepareContainerForItemOverride, и все готово:

<CustomItemsPanel>
    <CustomItemsPanel.ItemsPanelTemplate>
        <StackPanel/>
    </CustomItemsPanel.ItemsPanelTemplate>

    Here is some Free Floating Text

</CustomItemsPanel>

и затем в бэкэнде:

public class CustomItemsPanel : ItemsPanel
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        if(item is string str)
        {
            item = new TextBlock {Text=str, TextWrapping=TextWrapping.Wrap};
        }

        return base.PrepareContainerForItemOverride(element, item);
    }
}
0 голосов
/ 25 июня 2018

Непонятно, зачем нужна StackPanel, но я предполагаю, что это так.

Первый фрагмент XAML не верен и не может быть выполнен.

StackPanels не знает о текстеформатирование и строки не могут быть вставлены в StackPanel, как указано в первом фрагменте XAML.StackPanel размещает другие элементы управления, а не строки.

Таким образом, чтобы поместить текст в StackPanel, текст должен быть добавлен в элемент управления.Есть несколько вариантов:

  1. TextBlock (очень простое форматирование текста)
  2. Метка (очень похоже на TextBlock с дополнительной обработкой фокуса)
  3. RichTextBox (больше макета /параметры разметки, редактирование, формат RTF)
  4. DocumentViewer (очень богатый формат просмотра текста XPS)
  5. WebBrowser (для отображения HTML)

Как вы упоминали, TextBlock будетпозволяет вам обернуть текст, и это самый простой вариант, который доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...