Доброго времени суток. Осваиваю Silverlight, столкнулся с такой проблемой: в некоторых случаях ссылки по именам или ключам из расширения {StaticResource} заканчиваются XamlParseException'ом. Причем, я не могу понять в чем именно проблема - в namescope''ах и словарях Сильвера или конкретных классах.
Вот пример работающий на Silverlight 5 :
| Код | <UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" > <UserControl.Resources> <System:Double x:Key="_blockSize"> 17 </System:Double> <Storyboard x:Name="_myStoryboard"> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="_blockMoving" Storyboard.TargetProperty="X" Duration="0:0:10" > <!-- KeyTime properties are expressed as TimeSpan values. --> <LinearDoubleKeyFrame Value="100" KeyTime="0:0:3" /> <LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" /> <LinearDoubleKeyFrame Value="500" KeyTime="0:0:9" /> <LinearDoubleKeyFrame Value="600" KeyTime="0:0:10" /> </DoubleAnimationUsingKeyFrames> </Storyboard> </UserControl.Resources> <Grid > <Canvas> <Path MouseLeftButtonDown="Mouse_Clicked" Fill="Blue" Stretch="Fill" > <Path.Data> <EllipseGeometry RadiusX="{StaticResource _blockSize}" RadiusY="{StaticResource _blockSize}" /> </Path.Data>
<Path.RenderTransform> <TranslateTransform x:Name="_blockMoving" X="0" Y="0" /> </Path.RenderTransform> </Path> </Canvas> </Grid> </UserControl>
|
| Код | private void Mouse_Clicked(object sender, MouseButtonEventArgs e) { _myStoryboard.Begin(); }
|
Теперь, допустим, я хочу вынести EllipseGeometry в ресурсы, то есть этот кусок:
| Код | <Path MouseLeftButtonDown="Mouse_Clicked" Fill="Blue" Stretch="Fill" > <Path.Data> <EllipseGeometry RadiusX="{StaticResource _blockSize}" RadiusY="{StaticResource _blockSize}" /> </Path.Data> ... </Path
|
переписываю так:
| Код | ... <UserControl.Resources> <EllipseGeometry x:Key="_pathData" RadiusX="{StaticResource _blockSize}" RadiusY="{StaticResource _blockSize}" /> ... </UserControl.Resources> ... <Path MouseLeftButtonDown="Mouse_Clicked" Fill="Blue" Stretch="Fill" Data="{StaticResource _pathData}" > ... </Path>
|
Теперь во время загрузки xaml вылетает исключение:
| Код | XamlParseException Не удалось присвоить свойству "System.Windows.Shapes.Path.Data" [Line: 41 Position: 22]
|
Где строка 41 это:
| Код | Data="{StaticResource _pathData}"
|
Я возвращаюсь к рабочему примеру и хочу теперь попробовать привязать старт анимации к моменту загрузки контрола. То есть добавить после </UserControl.Resources> следующий код:
| Код | <UserControl.Triggers> <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="{StaticResource _myStoryboard}"/> </EventTrigger> </UserControl.Triggers>
|
И снова исключение:
| Код | XamlParseException Не удалось присвоить свойству "System.Windows.Media.Animation.BeginStoryboard.Storyboard" [Line: 32 Position: 41]
|
где строка 32 это:
| Код | <BeginStoryboard Storyboard="{StaticResource _myStoryboard}"/>
|
Если продолжать экспериментировать, то выяснится, что я вообще не могу привязать свойство Path.Data через {StaticResource}. По крайней мере на нашел, как. Где-то на Stack Overflow видел предположение, что для второй моей ошибки виноват может быть не StaticResource, а поиск объекта, указанного в Storyboard.TargetName (действительно - Storyboard.TargetNameProperty в Silverlight равен null во время инициализации UserControl, в отличии от WPF), но ковыряние доков про namescope'ам ни к чему не привело. Почитаю еще про систему словарей в Silverlight, ибо очень интересно, почему в SL необязательно задавать x:Key на ресурсы и можно задавать в StaticResource значения x:Name элементов.
Если же кто-то может что-либо подсказать или предположить, буду рад любой помощи. |