Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 内容控件中字符串的自动模板化_Wpf_Xaml_Contentcontrol - Fatal编程技术网

Wpf 内容控件中字符串的自动模板化

Wpf 内容控件中字符串的自动模板化,wpf,xaml,contentcontrol,Wpf,Xaml,Contentcontrol,我对内容控件中的数据模板设置有问题。这是我以前用datatemplateselector克服的一种情况,但我觉得我肯定错过了什么 考虑这个Xaml: <Grid> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> </Style>

我对内容控件中的数据模板设置有问题。这是我以前用datatemplateselector克服的一种情况,但我觉得我肯定错过了什么

考虑这个Xaml:

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap" />
        </Style>
    </Grid.Resources>
    <ContentControl MaxWidth="50" Content="This is a string and it should be wrapped."/>
</Grid>
我的样式未应用于生成的文本块。我怀疑这是因为生成的textblock不是逻辑树的一部分。datatemplate选择器解决了这个问题,这很好,但我觉得这不是最好的解决方案

有什么建议可以让你用最简洁灵活的方式来解决这个问题吗?我正在使用.NET4.0


EDIT:DataType={x:Type String}的Datatemplate也解决了这个问题,但它也感觉像是一个黑客。

生成的文本块是逻辑树的一部分Noop会为您确认,但是,ContentControl就像ControlTemplate一样是一个边界,除非在应用程序范围中定义了隐式样式,否则WPF不会自动将隐式样式应用于。如果您将样式从Grid.Resources移动到Application.Resources,您可以看到它工作得很好。对于您的用例,我想说使用DataType={x:Type sys:String}指定一个DataTemplate是非常干净的。我不太清楚你为什么认为这是一个黑客行为,因为它确切地定义了它的功能。通过定义DataTemplate,可以使样式的范围特定于ContentControl,如果选择,可以始终使用Style.BasedOn从同一元素的更高范围样式派生样式。我更喜欢这个而不是DataTemplateSelector。我个人的偏好是在数据类型相同时使用DataTemplateSelector,但我需要使用不同的视觉表示。如果数据类型本身不同,那么DataTemplateSelector就不适用了。谢谢@Viv的解释。我不知道存在这样的界限。我想这是一个性能问题?知道这一点可以解释我观察到的许多奇怪行为。欢迎:。我不会说它与性能有关,因为从控件派生的任何东西都应该?继续使用隐式样式,但是像TextBlock这样的东西是从FrameworkElement派生的,并且存在有效的情况,您不希望它们被隐式样式化。例如,假设按钮中的文本应用了TextBlock样式,因为它是隐式样式。如果不查看代码,则无法添加注释。但是,如果您的隐式样式的目标是一个控件或从它派生的东西,而不是框架元素,那么它将通过边界。