AdornedElementPlaceholder

AdornedElementPlaceholder

我正在尝试为我的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吗?

干杯,
雅洛金

最佳答案

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

如果使用Template,则没有任何内容会自动获得原始控制权,因此您应该定义完整的模板。

如果您想将多个控件简单地组合成一个控件,则比创建完整的模板更简单,则建议创建一个普通的UserControl

关于c# - 在普通ContentTemplate中使用AdornedElementPlaceholder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26631567/

10-13 07:39