我知道如果您键入:
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>
但是我喜欢第一个选项的简单语法-必须有一种告诉它包装的方法!有任何想法吗?
答案 0 :(得分:1)
目前尚不清楚为什么需要StackPanel,但我认为是必要的。
第一个XAML片段不正确,无法执行。
StackPanel不了解文本格式,并且如第一个XAML片段所述,不能将字符串插入StackPanel。 StackPanel排列其他控件而不是字符串。
因此,要将文本放入StackPanel中,必须将文本添加到控件中。有几种选择:
正如您提到的,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);
}
}