Обработка RoutedEvent окна во многих элементах WPF с помощью стиля - PullRequest
2 голосов
/ 10 февраля 2012

У меня следующее перенаправленное событие:

public static readonly RoutedEvent FakeEvent = EventManager.RegisterRoutedEvent(
    "Fake", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(MainWindow));
public event RoutedEventHandler Fake
{
    add { AddHandler(FakeEvent, value); }
    remove { RemoveHandler(FakeEvent, value); }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    RoutedEventArgs newEventArgs = new RoutedEventArgs(MainWindow.FakeEvent);
    RaiseEvent(newEventArgs);
}

У меня есть следующий XAML:

<Window.Resources>

    <Style TargetType="{x:Type TextBlock}"
       xmlns:local="clr-namespace:WpfApplication1">
        <Setter Property="Margin" Value="10" />
        <Setter Property="Background" Value="Red" />
        <Style.Triggers>
            <EventTrigger RoutedEvent="local:MainWindow.Fake">
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation To="Blue" Duration="0:0:1"
                            Storyboard.TargetProperty="Background.Color" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

</Window.Resources>

<StackPanel>
    <Button Click="Button_Click">Raise Event</Button>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
</StackPanel>

Моя цель состоит в том, чтобы перенаправленное событие окна вызвало раскадровку для всехTextBlocks, используя повторно используемый, общий стиль.Однако повышение перенаправленного события (путем нажатия кнопки) не приводит к возникновению ничего (без ошибок, просто ничего).Не уверен, что не так.

Какой правильный подход к этому?

1 Ответ

1 голос
/ 11 февраля 2012

Возможно, вы неправильно поняли, как работает tunneling :

Tunneling: Изначально вызывались обработчики событий в корне дерева элементов.Затем перенаправленное событие проходит маршрут через последовательные дочерние элементы вдоль маршрута к элементу узла, который является источником перенаправленного события (элемент, вызвавший перенаправленное событие).

Здесь событие будет перемещаться изкорень, окно, источник, также окно, оно никогда не встретит TextBlocks.Вам нужно либо поднять событие на всех них, либо прослушать событие в окне, к сожалению, вы не можете использовать EventTrigger.SourceName в стилях.К сожалению, я не знаю ни одного хорошего решения этой проблемы ...

(Вы можете использовать EventSetter для обработки Loaded события TextBlocks, чтобы затем прослушать событие наокно и повторно вызвать его локально (вы захотите изменить стратегию маршрутизации или вы получите исключение переполнения стека, если не проверяете, откуда пришло событие), это может быть сомнительно, если это хорошая идея)

...