我正在尝试为我的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内而不是AdornedElementPlaceholder内放置另一个TextBox并将不同的值(文本,样式等)绑定到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吗?
干杯,
雅洛金
最佳答案
您的错误是AdornedElementPlaceholder
与Validation.ErrorTemplate
一起使用的原因。在这种情况下,它将保留原始控制权并将其放在AdornedElementPlaceholder
位置。
如果使用Template
,则没有任何内容会自动获得原始控制权,因此您应该定义完整的模板。
如果您想将多个控件简单地组合成一个控件,则比创建完整的模板更简单,则建议创建一个普通的UserControl
。
关于c# - 在普通ContentTemplate中使用AdornedElementPlaceholder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26631567/