Активировать триггер из внешнего контроля - PullRequest
0 голосов
/ 29 июня 2009

WPF новичок здесь, так что извините за простой вопрос. Как заставить триггер сработать в UserControl из элемента управления вне этого UserControl? Вот что я хочу сделать ...

У меня есть UserControl с триггером, настроенным на отображение изменения цвета фона, когда IsMouseOver имеет значение True. Если я наведу курсор мыши на UserControl, триггер сработает, как я и ожидал. Я хотел бы создать окно, содержащее UserControl и кнопку, а когда пользователь наведет курсор на кнопку, запустить триггер UserControl. Что-то вроде:

<Window x:Class="WpfApplication1.SimpleUCTry1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1.SimpleUCTry1"
Title="Window1" Height="300" Width="300">
<StackPanel>
    <local:Simple />
    <Button Content="Foo" />
</StackPanel>

Таким образом, если пользователь наводит курсор на кнопку «Foo», срабатывает триггер «Simple» UserControl.

Возможно ли это?

Спасибо, Andy

Ответы [ 3 ]

2 голосов
/ 29 июня 2009

Поскольку ваш элемент управления является «внешним» по отношению к кнопке, вы не можете использовать триггеры свойств или триггеры данных, чтобы перевернуть фон. Вам нужен EventTrigger на уровне окна.

Запустите ключевой кадр или анимацию дискретного цвета с длительностью 0 в MouseEnter и удалите упомянутую раскадровку в MouseLeave:

<Window.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="button">
        <BeginStoryboard x:Name="Change_Control_Background_Start" 
            Storyboard="{StaticResource Change_Control_Background}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="button">
        <RemoveStoryboard 
            BeginStoryboardName="Change_Control_Background_Start"/>
    </EventTrigger>
</Window.Triggers>
1 голос
/ 29 июня 2009

Еще один способ сделать это (требует некоторого кода, но, вероятно, самый чистый}

<StackPanel>
    <local:Simple Background="{Binding ElementName=bnFoo, 
                  Path=IsMouseOver, 
                  Converter={StaticResource boolToBackgroundConv}}"/>
    <Button Name="bnFoo" Content="Foo" />
</StackPanel>
1 голос
/ 29 июня 2009

Ответ Сергея - это способ сделать это, если вам нужно что-то, что нельзя сделать с помощью EventTrigger, вы всегда можете обернуть ваши элементы управления в DataTemplate и использовать ContentPresenter, чтобы показать это:

<Window x:Class="WpfApplication1.SimpleUCTry1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1.SimpleUCTry1"
    Title="Window1" Height="300" Width="300">
    <ContentPresenter Content="{Binding}">
        <ContentPresenter.ContentTemplate>
            <DataTemplate>
                <StackPanel>
                    <local:Simple Name="Ctrl1" />
                    <Button Name="Ctrl2" Content="Foo" />
                </StackPanel>
                <DataTemplate.Triggers>
                    <Trigger SourceName="Ctrl2" Property="IsMouseOver" Value="True">
                        <Setter TargetName="Ctrl1" Property="Background" Value="Blue"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ContentPresenter.ContentTemplate>
    </ContentPresenter>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...