Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Проблемы со StaticResource в XAML Silverlight


Автор: dzaraev 24.6.2013, 13:56
Доброго времени суток. Осваиваю 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 элементов.

Если же кто-то может что-либо подсказать или предположить, буду рад любой помощи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)