-1

我有一个用 xaml 编写的模板。你能写出如何为 TextBox 打开模板吗?

        <Grid.Resources>
        <Storyboard x:Key="FlashErrorIcon">
        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00"                                        Storyboard.TargetProperty="(UIElement.Visibility)">
                <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Hidden}"/>                                 
                <DiscreteObjectKeyFrame KeyTime="00:00:03.2000000" Value="{x:Static Visibility.Visible}"/>
                <DiscreteObjectKeyFrame KeyTime="00:00:01" Value="{x:Static Visibility.Visible}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="Background" Value="Pink"/>
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
            </Style.Triggers>
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <DockPanel LastChildFill="True"                    
                                   ToolTip="{Binding ElementName=controlWithError,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                            <Ellipse DockPanel.Dock="Right" 
                             ToolTip="{Binding ElementName=controlWithError, 
                                 Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                             Width="15" Height="15" 
                             Margin="-25,0,0,0"
                             StrokeThickness="1" Fill="IndianRed" >
                                <Ellipse.Stroke>
                                    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                        <GradientStop Color="#FFFA0404" Offset="0"/>
                                        <GradientStop Color="#FFC9C7C7" Offset="1"/>
                                    </LinearGradientBrush>
                                </Ellipse.Stroke>
                                <Ellipse.Triggers>
                                    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                                        <BeginStoryboard Storyboard="{StaticResource FlashErrorIcon}"/>
                                    </EventTrigger>
                                </Ellipse.Triggers>
                            </Ellipse>
                            <TextBlock DockPanel.Dock="Right" 
                            ToolTip="{Binding ElementName=controlWithError, 
                                 Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                            Foreground="White"
                            FontSize="10" 
                            Margin="-15,5,0,0" FontWeight="Bold">!
                        <TextBlock.Triggers>
                            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                                <BeginStoryboard Storyboard="{StaticResource FlashErrorIcon}"/>
                            </EventTrigger>
                        </TextBlock.Triggers>
                            </TextBlock>
                            <Border BorderBrush="Red" BorderThickness="1">
                                <AdornedElementPlaceholder Name="controlWithError"/>
                            </Border>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>

我试图以不同的方式在 TextBox 中包含,但我没能做到。如何包含此模板?

    <TextBox>?????????What should I write here???????????>
     ?????????What should I write here???????????
    </TextBox>

如何开启模板?任何帮助将不胜感激!

4

2 回答 2

1

您忘记将密钥添加textBoxInError到您的 TextBox 样式:

<Grid.Resources>
    ...
    <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
        ...
    </Style>
    ...
</Grid.Resources>

如果没有该键,则 Style 将作为 TextBox 的默认样式处理。在这种情况下,您不会在 TextBox 声明中显式引用样式,并且必须删除该Style="{StaticResource textBoxInError}"部分。


编辑:如果您的 Style 包含在资源字典中(例如Grid.Resources在您的 XAML 中)并且具有如上所示的 Key ( textBoxInError),您将像这样使用该 Style:

<Grid>
    <Grid.Resources>
        <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
        ...
        </Style>
        ...
    </Grid.Resources>
    ...
    <TextBox Style="{StaticResource textBoxInError}" ... />
</Grid>
于 2012-12-18T09:50:49.110 回答
1

你的风格有以下减速:

这意味着此样式将应用于所有文本框。除非你自己设置不同的风格。

当你写这个:

<TextBox Validation.ErrorTemplate="{StaticResource FlashErrorIcon}"
     Style="{StaticResource textBoxInError}" TabIndex="1" Margin="147,145,168,131">

您正在更改默认样式(更改为名为 的样式textboxInError)...

所以只需Style从文本框中删除该属性。

另一种解决方案

如果您想为样式指定一个特定名称而不是使其成为默认样式,请使用:

<Style TargetType="{x:Type TextBox}" x:Key="textBoxInError" >

然后您的原始代码将正常工作,例如

<TextBox Style="{StaticResource textBoxInError}" />
于 2012-12-18T09:51:32.777 回答