我试图为我的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
答案 0 :(得分:1)
您的错误是AdornedElementPlaceholder
与Validation.ErrorTemplate
一起使用的错误。在这种情况下,它将采用原始控制并将其放在AdornedElementPlaceholder
。
如果您使用Template
,那么任何内容都不会自动进行原始控制,您应该定义完整的模板。
如果您想简单地将多个控件合并为一个,我建议创建一个普通的UserControl
,这比处理完整的模板更简单。