在普通ContentTemplate中使用AdornedElementPlaceholder

本文关键字:AdornedElementPlaceholder ContentTemplate | 更新日期: 2023-09-27 18:28:12

我正在尝试为我的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等)绑定到TemplatedPrent:

<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

在普通ContentTemplate中使用AdornedElementPlaceholder

您的错误是AdornedElementPlaceholderValidation.ErrorTemplate结合使用。在这种情况下,它将获得原始控制,并将其放在AdornedElementPlaceholder的位置。

如果您使用Template,那么没有什么会自动获得原始控制,您应该定义完整的模板。

如果你想简单地将几个控件组合成一个控件,我建议你创建一个普通的UserControl,这比处理完整的模板更简单。

相关文章:
  • 没有找到相关文章