无法访问WPF故事代码后面的故事板名称

时间:2019-04-28 18:50:40

标签: c# wpf xaml

我要使闪烁的TextBlock的文本。但是,无法访问情节提要。 请检查以下代码:

XAML

<Page.Resources>
    <Storyboard x:Name="BlinkLabelStoryBoard" x:Key="BlinkLabel" Duration="0:0:2" RepeatBehavior="Forever">
        <ColorAnimationUsingKeyFrames
                                Storyboard.TargetName="DeviceState"
                                Storyboard.TargetProperty="Foreground.(SolidColorBrush.Color)">
            <DiscreteColorKeyFrame KeyTime="0:0:0" Value="White"/>
            <DiscreteColorKeyFrame KeyTime="0:0:1" Value="OrangeRed"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>
</Page.Resources>

<TextBlock x:Name="DeviceState" Text="{Binding RunMode}" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center" Loaded="Start_Animation">

隐藏代码

private void Start_Animation(object sender, RoutedEventArgs e)
{
    Storyboard board = (FindResource("BlinkLabelStoryBoard") as Storyboard);
    board.Begin();
}

但是,发生错误BlinkLabelStoryBoard resource not found。 并且,发生另一错误DeviceState资源未找到。

2 个答案:

答案 0 :(得分:1)

FindResource需要键而不是名称。

XAML

<Page.Resources>
    <Storyboard x:Key="BlinkLabel" Duration="0:0:2" RepeatBehavior="Forever">
        <ColorAnimationUsingKeyFrames

C#

private void Start_Animation(object sender, RoutedEventArgs e)
{
    Storyboard board = (FindResource("BlinkLabel") as Storyboard);

名称变成C#代码中的标识符。键是字典中的索引,在这种情况下为ResourceDictionary。

请参见https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.findresource?view=netframework-4.8

答案 1 :(得分:0)

我的代码中有一些错误。

  1. (感谢Emo de Weerd),FindResource无法找到BlinkLabelStoryBoard,因为FindResource需要键而不是名称。因此,我在Start_Animation处理程序中更改了代码,并在Xaml中删除了情节提要的名称。

    Storyboard board =(作为Storyboard的FindResource(“ BlinkLabel”));

  2. Storyboard.TargetName无法找到目标TextBlock的名称。因此,我将Storyboard.TargetName更改为{Binding ElementName=DeviceState}

  3. board.Begin需要一个目标元素。因此,我将相关代码更改为board.Begin(sender as TextBlock)

最后,请参考以下完整代码:

XAML

<Page.Resources>
    <Storyboard x:Key="BlinkLabel" Duration="0:0:2" RepeatBehavior="Forever">
       <ColorAnimationUsingKeyFrames
                                Storyboard.TargetName="{Binding ElementName=DeviceState}"
                                Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)">
            <DiscreteColorKeyFrame KeyTime="0:0:0" Value="White"/>
            <DiscreteColorKeyFrame KeyTime="0:0:1" Value="OrangeRed"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>
</Page.Resources>

...

<TextBlock x:Name="DeviceState" Text="{Binding RunMode}" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center" Loaded="Start_Animation">

隐藏代码

private void Start_Animation(object sender, RoutedEventArgs e)
{
    Storyboard board = (FindResource("BlinkLabel") as Storyboard);
    board.Begin(sender as TextBlock);
}