在普通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
您的错误是AdornedElementPlaceholder
与Validation.ErrorTemplate
结合使用。在这种情况下,它将获得原始控制,并将其放在AdornedElementPlaceholder
的位置。
如果您使用Template
,那么没有什么会自动获得原始控制,您应该定义完整的模板。
如果你想简单地将几个控件组合成一个控件,我建议你创建一个普通的UserControl
,这比处理完整的模板更简单。