У меня есть ContentControl
, что я стилю с DataTemplate
. Я хотел бы иметь возможность определять анимацию за пределами ContentControl
, которая анимирует элементы в DataTemplate
. Это XAML представляет собой небольшой, упрощенный пример моего сценария:Анимированные элементы в DataTemplate ContentControl
<UserControl x:Class="StoryboardTesting.Stage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<UserControl.Resources>
<DataTemplate x:Key="MyControlTemplate">
<StackPanel>
<TextBlock x:Name="TheBlock1" Text="Foo!" />
<TextBlock x:Name="TheBlock2" Text="Bar!" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="ValueStates">
<VisualState Name="ToState">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MyContentControl"
Storyboard.TargetProperty="(UIElement.Opacity)"
Duration="0:0:1"
To="0" />
</Storyboard>
</VisualState>
<VisualState Name="FromState" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid>
<Canvas>
<ContentControl x:Name="MyContentControl"
ContentTemplate="{StaticResource MyControlTemplate}" />
</Canvas>
</Grid>
</UserControl>
Я хотел бы анимации, чтобы иметь возможность выбрать либо TextBox
в шаблоне (вместо «MyContentControl»), либо позиции или имени. Я начинаю анимацию в UserControl
«s кода за вызовом, как это:
VisualStateManager.GoToElementState(this, "ToState", true);
Когда я запускаю это (замена„MyContentControl“с„TheBlock“), я получаю следующее:
InvalidOperationException: имя «TheBlock1» не может быть найдено в области имен «StoryboardTesting.Stage».
Это имеет смысл. Есть ли способ адресовать любой блок, используя имена свойств? Мне нужно избегать codebehind, поскольку это XAML, который создается во время выполнения.
Вы нашли решение по вашей проблеме? – Aybe