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的触发器。
这可能吗?
谢谢你, 安迪
答案 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>