在 ContentPresenter 中确保 AdornmentDecorator,但没有 ControlTemplate

Posted

技术标签:

【中文标题】在 ContentPresenter 中确保 AdornmentDecorator,但没有 ControlTemplate【英文标题】:Ensuring AdornmentDecorator within a ContentPresenter, but without a ControlTemplate 【发布时间】:2014-03-04 00:58:22 【问题描述】:

我已经搜索了很多,但似乎无法破解这个坚果。

我有一个主视图动态变化的应用程序,为此我使用了与控件绑定的内容演示器:

    <ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
        <StackPanel Margin="20,20,20,500">
            <ContentPresenter Content="Binding MainControl"/>
        </StackPanel>
    </ScrollViewer>

然后我在运行时在我的视图模型中更改 MainControl。问题是被绑定的控件不能可靠地显示它们的错误模板......我怀疑这是由于这里讨论的原因:

Validation ErrorTemplate not showing on data errors

但是这个问题的修复似乎对我不起作用,因为我没有在我的内容演示者周围使用控制模板。当我将 AdornmentDecorator 标签包裹在我的内容演示者周围时,它似乎并没有解决问题。如果我在加载到 contentpresenter(作为根元素)的每个控件中放置一个 AdornmentDecorator,它确实有效,但如果可能的话,我想避免这种重复。

有什么见解吗?

更新

我尝试了 Dennis 建议的这种方法,但无济于事。控件绑定没问题,但它的效果并不比当前方法好(也显示在下面的注释中)。注意:我尝试使用 AdornerDecorator 作为单例元素,就像 Dennis 那样,并围绕 ContentPresenter,如下所示。两者都没有显示出任何差异 - 当 MainControl 绑定发生变化时,我的控件周围的装饰器都会消失。

<UserControl.Resources>
    <Style x:Key="MainContentControl" TargetType="x:Type ContentControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ContentControl">
                    <Grid>
                        <AdornerDecorator>
                            <ContentPresenter Content="Binding MainControl"/>
                        </AdornerDecorator>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</UserControl.Resources>
<Grid>

     .....


    <ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
        <StackPanel Margin="20,20,20,500" >
            <ContentControl Style="StaticResource MainContentControl"/>
        </StackPanel>
    </ScrollViewer>

    <!-- THE BELOW WORKS IF I SURROUND EACH BOUND CONTROL WITH adornerdecorator -->
    <ScrollViewer Grid.Column="2" x:Name="StepScrollViewer">
        <StackPanel Margin="20,20,20,500">
            <ContentPresenter Content="Binding MainControl"/>
        </StackPanel>
    </ScrollViewer>
    -->

【问题讨论】:

【参考方案1】:

我不会直接使用ContentPresenter,而是使用ContentControlContentControl 是包含其他元素并具有 Content 属性的控件的基类,例如Button.

然后您可以覆盖模板以在ContentControl 旁边添加一个AdornerDecorator。这与您之前尝试的不同,因为现在ContentPresenterAdorner 属于同一可视化树。

<Style TargetType="x:Type ContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type ContentControl">
                <AdornerDecorator>
                    <ContentPresenter/>
                </AdornerDecorator>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

编辑:忘记了AdornerDecorator 需要包裹容器,而不仅仅是并排放置。

【讨论】:

如果这不起作用;让我知道,我会进一步提供帮助。我已经有一段时间没有使用 WPF 做了任何事情了。 我想我需要与此相关的另一部分 XAML...是题外话),但我如何将样式“应用”到滚动面板或......好吧,我将它应用到什么?然后我将如何将其动态绑定到控制 MVVM 样式? 好吧,从技术上讲,以上内容并不能按照我想要的方式工作。实际上,我仍然需要在加载到内容演示器中的每个用户控件的主体周围放置一个 AdornerDecorator 元素。现在,我想这就是我要做的。

以上是关于在 ContentPresenter 中确保 AdornmentDecorator,但没有 ControlTemplate的主要内容,如果未能解决你的问题,请参考以下文章

WPF:ContentPresenter 根据样式的位置意外更改前景

WPF:ContentPresenter 上的 TextTrimming

ContentControl与ContentPresenter区别?

WPF WindowChrome ContentPresenter 不显示内容

ContentPresenter理解

网格内的 ContentPresenter 可见性绑定不起作用?