Управление раскадровкой UserControl из родительского окна в WPF с использованием только XAML - PullRequest
5 голосов
/ 13 января 2009

Я создал очень простое тестовое приложение, чтобы попытаться решить эту проблему, описанную мне коллегой. Он смог запустить его в C #, но я считаю, что ему нужно было решение более универсальным, и он хотел, чтобы это делалось строго в XAML. Проблема заключалась в следующем: как вы запускаете раскадровку внутри UserControl в ответ на событие в элементе управления в содержащем окне (родительский элемент не обязательно должен быть окном, это может быть страница или другой пользовательский элемент управления .. Я использую окно для простоты). Итак, мой лучший пример - у вас есть окно с кнопкой и экземпляр вашего UserControl. Вы хотите, чтобы событие Click для кнопки запускало раскадровку внутри UserControl.

Внутри самого UserControl Storyboard объявляется как ресурс с ключом MyStoryboard. Я создал кнопку с EventTrigger, чтобы показать, что я могу вызвать раскадровку, ссылаясь на нее с помощью выражения Binding. Вот полный XAML для моего UserControl:

<UserControl x:Class="UserControlStoryboard.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<UserControl.Resources>
    <Storyboard x:Key="MyStoryboard">
        <ColorAnimation Storyboard.TargetName="grid" Storyboard.TargetProperty="(Grid.Background).Color" From="CadetBlue" To="White" Duration="0:0:2" />
    </Storyboard>
</UserControl.Resources>
<Grid Background="CadetBlue" x:Name="grid">
    <Button Content="Press Me" Height="50">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <BeginStoryboard.Storyboard>
                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" Path="Resources[MyStoryboard]" />
                    </BeginStoryboard.Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>            
</Grid>

Я надеялся, что, поскольку я смог сказать Storyboard начать с ссылки на него с помощью выражения Binding, я смогу сделать то же самое из Window, который содержит этот UserControl в качестве дочернего элемента. Но я не могу понять, как получить ссылку на раскадровку внутри родительского окна. Разве это невозможно сделать только в XAML?

В родительском окне моего тестового проекта нет ничего, кроме кнопки и экземпляра этого UserControl. Если это вообще возможно, какой элемент позволил бы мне добавить EventTrigger, где источником события является Button, а действие триггера сообщает Storyboard UserControl о начале?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 июля 2009

Я думаю, что идея реагирования на внешние события в UserControl не очень безопасна. В UserControl вы хотите реагировать только на события, которые рождаются в элементе управления.

Можете ли вы изменить ситуацию и сделать следующее:?

  • Предоставить свойство UC, которое необходимо анимировать, как свойство зависимости (в данном случае фон)
  • Создайте EventTrigger и Storyboard в родительском окне
1 голос
/ 13 января 2009

Вы можете получить доступ к раскадровке с помощью StaticResource. Вам нужно только назначить ресурс раскадровке на BeginStroyboard.

<BeginStoryboard Storyboard="{StaticResource MyStoryboard}">
</BeginStoryboard>

Я изменил код на следующий, и когда вы нажимаете кнопку, он запускает раскадровку для вас. Надеюсь, это поможет.

    <UserControl.Resources>
    <Storyboard x:Key="MyStoryboard">
        <ColorAnimation Storyboard.TargetName="grid" Storyboard.TargetProperty="(Grid.Background).Color" From="CadetBlue" To="White" Duration="0:0:2" />
    </Storyboard>
</UserControl.Resources>
<Grid Background="CadetBlue" x:Name="grid">
    <Button Content="Press Me" Height="50">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard Storyboard="{StaticResource MyStoryboard}">
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>
0 голосов
/ 14 июля 2009

Вероятно, нет хорошего способа сделать это с чистым Xaml.

Вы можете:

  • Создайте свойство зависимости в вашем UserControl, которое принимает Button, затем вы можете привязать к нему.
  • Сделайте какой-нибудь сумасшедший конвертер, который перебирает ваше визуальное дерево, ища что-то конкретное.

Оба требуют некоторого C #, поэтому я не знаю, является ли что-то из вышеперечисленного тем, что вы ищете.

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