Имя раскадровки WPF за кодом недоступно - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу сделать мигающий текст 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 ]

1 голос
/ 28 апреля 2019

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

0 голосов
/ 28 апреля 2019

В моем коде были некоторые ошибки.

  1. (спасибо Эмо де Вирду) FindResource не удалось найти BlinkLabelStoryBoard, поскольку FindResource ожидает ключ, а не имя. Итак, я изменил код в обработчике Start_Animation и удалил имя раскадровки в Xaml.

    Раскадровка доски = (FindResource ("BlinkLabel") как раскадровка);

  2. Storyboard.TargetName не удалось найти имя Target 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...