2009-06-28 5 views
0

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 был бы огонь.

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

Спасибо, Энди

ответ

2

С вашим контролем является «внешним» к кнопке, вы не можете использовать триггеры собственности или данные триггеров флип фон. Вам нужен уровень EventTrigger on Window.

Начало ключевого кадра или дискретная анимации цвета с 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> 
+0

Благодарим за отзыв! Можно ли также выполнить это с помощью EventSetter или RoutedUICommand? – 2009-06-29 14:48:38

+0

Это возможно сделать с EventSetter, но для этого потребуется обработчик кода (в этом случае вы можете даже обрабатывать события мыши непосредственно кнопкой). Что касается RoutedUICommand, это не очень хорошо. Команда - это то, что пользователь делает намеренно, а зависание не входит в эту категорию. –

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> 
+0

Это хороший способ сделать это, так как у Энди уже есть UserControl. Просто добавьте упоминаемую к нему кнопку (по определению она привязана к ней визуально уже) и используйте упомянутый трюк ContentPresenter. –

1

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

<StackPanel> 
    <local:Simple Background="{Binding ElementName=bnFoo, 
        Path=IsMouseOver, 
        Converter={StaticResource boolToBackgroundConv}}"/> 
    <Button Name="bnFoo" Content="Foo" /> 
</StackPanel> 
Смежные вопросы