从外部控制激活触发器

时间:2009-06-28 21:24:39

标签: wpf user-controls triggers

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”按钮上,则会触发“简单”UserControl的触发器。

这可能吗?

谢谢你, 安迪

3 个答案:

答案 0 :(得分:2)

由于您的控件是按钮的“外部”,因此您无法使用属性触发器或数据触发器来翻转背景。你需要的是Window级别的EventTrigger。

在MouseEnter上启动0持续时间的关键帧或离散颜色动画,并在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 :(得分:1)

谢尔盖的答案就是这样做的方法,如果您需要使用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>

答案 2 :(得分:1)

还有一种方法(需要一些代码,但可能是最干净的)

<StackPanel>
    <local:Simple Background="{Binding ElementName=bnFoo, 
                  Path=IsMouseOver, 
                  Converter={StaticResource boolToBackgroundConv}}"/>
    <Button Name="bnFoo" Content="Foo" />
</StackPanel>