如何在堆栈面板中包装自由文本

时间:2018-06-25 18:38:34

标签: wpf xaml

我知道如果您键入:

use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = std::__cxx11::basic_string<char>; _Dp = std::default_delete<std::__cxx11::basic_string<char> >]’

XAML将把文本包装在TextBlock中,然后在StackPanel中显示新的文本块。但是,默认的TextBlock不会自动换行-您必须明确告知它。

所以我试图通过隐式样式告诉它包装:

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

但这没用。

Google建议像这样手动将文本放入文本块:

<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>

但是我喜欢第一个选项的简单语法-必须有一种告诉它包装的方法!有任何想法吗?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么需要StackPanel,但我认为是必要的。

第一个XAML片段不正确,无法执行。

StackPanel不了解文本格式,并且如第一个XAML片段所述,不能将字符串插入StackPanel。 StackPanel排列其他控件而不是字符串。

因此,要将文本放入StackPanel中,必须将文本添加到控件中。有几种选择:

  1. TextBlock(非常基本的文本格式)
  2. 标签(非常类似于具有额外焦点处理功能的TextBlock)
  3. RichTextBox(更多布局/标记选项,编辑,RTF格式)
  4. DocumentViewer(非常丰富的文本查看器XPS格式)
  5. WebBrowser(用于显示HTML)

正如您提到的,TextBlock允许您包装文本,这是可用的最简单的选项。

答案 1 :(得分:0)

感谢@Erno de Weerd-知道StackPanels无法在本地添加文本,这使我处在正确的轨道上。

我已经将问题简化到了很远。实际上,我有一个带有StackPanel的ItemsControl,因为它是ItemsPanelTemplate。那些可以直接接受Text的方法是因为它们在将输入内容放入ItemsPanelTemplate之前将其输入内容包装在ContentControl中。我覆盖了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);
    }
}