Silverlight не поддерживает RoutedEvent в EventTrigger, кроме Loaded



Если вы получили похожую ошибку:
Unhandled Error in Silverlight Application Attribute UIElement.MouseEnter value is out of range.
то давайте ее полечим.

Исходный код: Source for VS 2008

Книга "Введение в Silverlight 3" на странице 112 говорит “... обратите внимание, что RoutedEvent поддерживает только событие Loaded (Загружен).” Т.е. как в WPF, декларативно через XALM, это не работает.
Т.е. Silverlight 3 (и предшественники) для атрибута RoutedEvent в элементе EventTrigger в XALM разметке поддерживает только значение Loaded.

Но уже давно есть решение, например RoutedEvent on EventTrigger is giving error that Rectangle.MouseEnter value is out of range
Опишу его более подробно. Сначала посмотрим на разметку:

<UserControl x:Class="SilverlightAnimation.MainPage"
xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid Name="LayoutRoot" Margin="2" MouseEnter="LayoutRoot_MouseEnter" Background="Red">
<Grid.Resources>
<!--<Storyboard x:Name="LayoutRootStoryboard">-->
<Storyboard x:Key="LayoutRootStoryboard">
<DoubleAnimation
Storyboard.TargetName="LayoutRoot"
Storyboard.TargetProperty="Opacity"
From="1" To="0"
/>
</Storyboard>
</Grid.Resources>
<TextBlock Text="Как всикда, превед митвет!" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
</Grid>
</UserControl>


и посмотрим на код обработчиика LayoutRoot_MouseEnter

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Animation;


namespace SilverlightAnimation
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}


private void LayoutRoot_MouseEnter(object sender, MouseEventArgs e)
{
var element = (FrameworkElement)sender;
// если вы задали ключ x:Key или имя x:Name
var storyboard = (Storyboard)element.Resources["LayoutRootStoryboard"];
// строчка ниже будет работа только если вы задали имя x:Name
//var storyboard = (Storyboard)element.FindName("LayoutRootStoryboard");


storyboard.Begin();
}
}
}


Смысл этого в следующем:

  • Кидаем Storyboard в ресурсы любого элемента.

  • Если в коде мы легко получаем доступ к элементу, в ресурсах которого лежит Storyboard, то можем использовать обращение по ключю < Storyboard x:Key=”” >.
    Вот так мы будем доставать Storyboard :
    (Storyboard)element.Resources["LayoutRootStoryboard"];

  • Иначе можем идентифировать Storyboard по имени x:Name, но тогда оно должно быть уникальным в разметке XALM.
    Вот так получаем:
    (Storyboard)element.FindName("LayoutRootStoryboard");
    здесь element может быть любым элементом на странице

  • Запускаем анимацию методом .Begin()


Комментарии

  1. Спасибо огромное, а то уже вторые сутки голову ломала, почему не могу обратится к storyboard, находящегося где-нить в resources =)

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.