C# WPF 动画标签内容未显示

C# WPF Animated label content is not being shown

我正在尝试制作标签内容的动画,以便:

Loading
Loading.
Loading..
Loading...

再次:

Loading
Loading.
Loading..
Loading...

等等 example.

代码下方:

<Label Grid.Row="2" x:Name="CurrentTask" 
       FontFamily="Microsoft Sans Serif" FontSize="18" FontStyle="Italic" FontWeight="Bold" 
       Foreground="White" Content="Loading">
    <Label.Template>
        <ControlTemplate>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content" Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Label.Template>
</Label>

问题是标签内容在 wpf 中不可见 window。它没有显示。我做错了什么?

同样在类型的行中:

<DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/>

我想将标签内容连接到点,而不是对值进行硬编码,我该怎么做?我不想在每个 DiscreteObjectKeyFrame.

中重复 "Loading" 字符串

更新: 我没有在 IsEnabled=True 上引发触发器,而是在应用标签样式的情况下使用 label.loaded,例如:

    <Label Grid.Row="2" x:Name="CurrentTask" 
           FontFamily="Microsoft Sans Serif" FontSize="18" FontStyle="Italic"  
           Foreground="White" Content="Loading">
        <Label.Style>
            <Style TargetType="Label">
                <Style.Triggers>
                    <EventTrigger RoutedEvent="Label.Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever">
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </Label.Style>
    </Label>

除了触发器,您的 ControlTemplate 是空的,因此显然没有显示任何内容。

您可以添加一个 ContentPresenter,也可以删除 Storyboard.TargetName。您的触发器作用于 IsEnabled 设置为 false 看起来也很奇怪。

<Label.Template>
    <ControlTemplate TargetType="Label">

        <ContentPresenter/>

        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever">
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/>
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/>
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/>
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Label.Template>

但是,您实际上可能想要的是 Style Trigger 而不是 ControlTemplate Trigger:

<Label ...>
    <Label.Style>
        <Style TargetType="Label">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/>
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
</Label>

对于Content中重复的"Loading"字符串,只需要使用两个Labels,一个是固定的"Loading"字符串,一个是点,并调整它们的Padding。或者更好,两个 TextBlocks:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Loading"/>
    <TextBlock>
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Text" Duration="00:00:00.8" RepeatBehavior="Forever">
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value=""/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="."/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value=".."/>
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="..."/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</StackPanel>