Динамический доступ к ресурсам не работает в раскадровке - PullRequest
1 голос
/ 26 ноября 2010

Уважаемые, у меня следующая проблема с WPF 3.5. При доступе к динамическому ресурсу в раскадровке значение является неправильным (по-видимому, ссылка не разрешена), когда ресурс определен в окне, которое содержит целевой элемент управления.

Что я делаю не так, и есть ли правильный путь (или, по крайней мере, обходной путь)? По сути, я хочу, чтобы раскадровка использовала цвета из динамического ресурса, и я могу размещать эти ресурсы только локально на уровне окна.

Пример кода:

<Window
    x:Class="Test.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    MouseDoubleClick="Window_MouseDoubleClick">
    <Window.Resources>
        <Color x:Key="MyColor">Blue</Color>
    </Window.Resources>
    <Grid x:Name="outer">
        <Grid.Resources>
            <Storyboard x:Key="MyBoard">
                <ColorAnimationUsingKeyFrames
                    Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                    <LinearColorKeyFrame KeyTime="0:0:0" Value="Red"/>
                    <LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
            <SolidColorBrush x:Key="MyBrush" Color="{DynamicResource MyColor}"/>
        </Grid.Resources>
        <Grid x:Name="inner" Background="Green"/>
    </Grid>
</Window>

Код-за:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        Storyboard s = (Storyboard)outer.FindResource("MyBoard");
        inner.BeginStoryboard(s);
        //SolidColorBrush b = (SolidColorBrush)outer.FindResource("MyBrush");
        //inner.Background = b;
    }
}

Проблема в том, что ссылка Value="{DynamicResource MyColor}" не работает, значение прозрачно.

Я попробовал следующее:

  1. Если я переместу определение MyColor из ресурсов окна в ресурсы приложения, код будет работать как положено.
  2. Если я заменю начало раскадровки назначением другого ресурса (закомментируйте первые две строки в Window_MouseDoubleClick и раскомментируйте остальные), динамический доступ к ресурсу будет работать.
  3. Поведение в .NET 4 / WPF 4 такое же.
  4. Я попытался создать раскадровку из кода (только для теста), но не могу преобразовать строку <LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/> в процедурный код, потому что LinearColorKeyFrame не FrameworkElement. Может быть, это корень проблемы?

1 Ответ

1 голос
/ 26 ноября 2010

Я не знаю, есть ли способ сделать это с XAML и связыванием, я не мог заставить подобное работать в Silverlight, но в качестве обходного пути вы можете создать StoryBoard и анимации в коде: http://msdn.microsoft.com/en-us/library/cc189069(VS.95).aspx#procedural_code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...