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