在普通的ContentTemplate中使用AdornedElementPlaceholder

时间:2014-10-29 13:24:37

标签: c# wpf

我试图为我的TextBox实现一个模板,该模板在TextBox的右侧显示一点像在ValidationTemplates中可以实现的图像:

<ControlTemplate x:Key="TextBoxTemplate">
    <DockPanel>
        <Grid x:Name="image" DockPanel.Dock="Right" Margin="3,0,0,0" Width="20" Height="20">
            <Ellipse Width="20" Height="20" Fill="Red" />
            <TextBlock Text="!" VerticalAlignment="Top" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" FontSize="16" TextAlignment="Center" Margin="7,-1" />
        </Grid>
        <AdornedElementPlaceholder />
    </DockPanel>
</ControlTemplate>

但是当我尝试将TextBox.Template属性绑定到此StaticResource:

<TextBox Template="{StaticResource TextBoxTemplate}" Text="Test">

它不会显示TextBox本身。

我找到了一个解决方法,方法是在ControlTemplate中放置另一个TextBox而不是AdornedElementPlaceholder,并将不同的值(Text,Style等)绑定到TemplatedParent:

<ControlTemplate x:Key="TextBoxTemplate">
    <DockPanel DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
        <Grid x:Name="image" DockPanel.Dock="Right" Margin="3,0,0,0" Width="20" Height="20">
            <Ellipse Width="20" Height="20" Fill="Red" />
            <TextBlock Text="!" VerticalAlignment="Top" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" FontSize="16" TextAlignment="Center" Margin="7,-1" />
        </Grid>
        <TextBox Text="{Binding Text}" Style="{Binding Style}" Width="{Binding Width}" Height="{Binding Height}" />
    </DockPanel>
</ControlTemplate>

但这是一种相当丑陋的方法,因为你必须明确地绑定每个属性。

还有另一种更简单的方法吗? ValidationTemplate中的AdornedElementPlaceholder是如何完成的?我不能将它用于我的ContentTemplate吗?

干杯, Ialokim

1 个答案:

答案 0 :(得分:1)

您的错误是AdornedElementPlaceholderValidation.ErrorTemplate一起使用的错误。在这种情况下,它将采用原始控制并将其放在AdornedElementPlaceholder

的位置

如果您使用Template,那么任何内容都不会自动进行原始控制,您应该定义完整的模板。

如果您想简单地将多个控件合并为一个,我建议创建一个普通的UserControl,这比处理完整的模板更简单。