2013-04-12 2 views
0


Я занимаюсь созданием настраиваемого элемента управления (его просто настраиваемая сетка, полученная из Grid, я хотел бы сохранить ее в виде сетки из-за нескольких других вещей, которые я делаю хочу попробовать), на мой вопрос, почему не история доска работы, когда я пытаюсь запустить его из EventTrigger, но прекрасно работает при нормальном триггером мой код ниже:WPF Custom Control EventTrigger Not Firing или Animation Not Working

<Style TargetType="{x:Type local:GridEx}"> 
    <Setter Property="Width" Value="100" /> 
    <Setter Property="Height" Value="100" /> 

    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseRightButtonDown"> 
      <BeginStoryboard> 
       <Storyboard > 
        <DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
        <DoubleAnimation Storyboard.TargetProperty="Height" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <Trigger Property="IsMouseOver" Value="True" > 
      <!--<Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard > 
         <DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
         <DoubleAnimation Storyboard.TargetProperty="Height" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions> 
       <BeginStoryboard> 
        <Storyboard > 
         <DoubleAnimation Storyboard.TargetProperty="Width" To="100" Duration="0:0:1" FillBehavior="HoldEnd" /> 
         <DoubleAnimation Storyboard.TargetProperty="Height" To="100" Duration="0:0:1" FillBehavior="HoldEnd" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.ExitActions>--> 
      <Setter Property="Effect" Value="{StaticResource LiftEffect}"/> 
      <Setter Property="RenderTransform"> 
       <Setter.Value> 
        <TranslateTransform X="-1" Y="-1" /> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Panel.ZIndex" Value="10" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

идея довольно просто, когда пользователь удерживает нажатой правую кнопку мыши, я просто хочу, чтобы сетка увеличивалась в размере. Я знаю, что анимация работает, потому что, если я начинаю с Trigger «IsMouseOver», она работает нормально, но ничего не происходит, если я удерживаю мышь нажатой?
И не имеет значения для комментариев: P

Мое пользовательское управление происходит от сетки.

РЕДАКТИРОВАТЬ КОД ДОБАВЛЕНО

использованием System.Windows; с использованием System.Windows.Controls;

namespace WPFCCLIB 
{ 

    public class GridEx : Grid 
    { 
     public static readonly RoutedEvent LeftMouseDoubleClickEvent = EventManager.RegisterRoutedEvent("LeftMouseDoubleClick",RoutingStrategy.Bubble,typeof(RoutedEventHandler), typeof(GridEx)); 

     public event RoutedEventHandler LeftMouseDoubleClick 
     { 
      add { AddHandler(LeftMouseDoubleClickEvent, value); } 
      remove { RemoveHandler(LeftMouseDoubleClickEvent, value); } 
     } 

     static GridEx() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(GridEx), new FrameworkPropertyMetadata(typeof(GridEx))); 
     } 

     void RaiseLeftMouseDoubleClickEvent() 
     { 
      RoutedEventArgs newEventArgs = new  RoutedEventArgs(GridEx.LeftMouseDoubleClickEvent); 
      RaiseEvent(newEventArgs); 
     }  
    } 
} 
+0

Анимация работает отлично для стандартного 'Grid' есть что-нибудь в производном сетке, которая interferring с событиями мыши ?, вы пробовали 'RoutedEvent =" Grid.MouseRightButtonDown "'? –

+0

Насколько я могу сказать, я не добавил ничего, что могло бы помешать:/Но в отношении того, что он работает в обычной стилизованной сетке, я видел, что он работает, возможно, поэтому я немного запутался почему он внезапно не работает. – Heinrich

+0

Я просто установил производную сетку, и анимация прекрасно работает там, не могли бы вы отправить код из вашей производной сетки, имеет ли он свой собственный шаблон? –

ответ

0

Xaml:

<Window x:Class="WpfApplication10.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication10" 
     Title="MainWindow" Height="325" Width="422" Name="UI"> 
    <Window.Resources> 
     <Style TargetType="{x:Type local:GridEX}"> 
      <Setter Property="Width" Value="100" /> 
      <Setter Property="Height" Value="100" /> 
      <Style.Triggers> 
       <EventTrigger RoutedEvent="MouseRightButtonDown"> 
        <BeginStoryboard> 
         <Storyboard > 
          <DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
          <DoubleAnimation Storyboard.TargetProperty="Height" To="300" Duration="0:0:1" FillBehavior="HoldEnd" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

    <local:GridEX Background="Blue" /> 

</Window> 

Код:

namespace WpfApplication10 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 

    public class GridEX : Grid 
    { 
     public static readonly RoutedEvent LeftMouseDoubleClickEvent = EventManager.RegisterRoutedEvent("LeftMouseDoubleClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(GridEX)); 

     public event RoutedEventHandler LeftMouseDoubleClick 
     { 
      add { AddHandler(LeftMouseDoubleClickEvent, value); } 
      remove { RemoveHandler(LeftMouseDoubleClickEvent, value); } 
     } 

     static GridEX() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(GridEX), new FrameworkPropertyMetadata(typeof(GridEX))); 
     } 

     void RaiseLeftMouseDoubleClickEvent() 
     { 
      RoutedEventArgs newEventArgs = new RoutedEventArgs(GridEX.LeftMouseDoubleClickEvent); 
      RaiseEvent(newEventArgs); 
     } 
    } 
} 
+0

Это работает действительно, но только потому, что стиль определен в Windows.Resources, если вы должны были создать пользовательский элемент управления и иметь код в Generic.xaml, я не думаю, что он будет работать:/Mouse Over Trigger Fire, но а не Событие. Когда код находится в файле Generic.xaml. – Heinrich

+0

Тогда похоже, что вы неправильно загрузили generic.xaml в ресурсы приложения, Generic.xaml не действует ни на какой другой ResourceDictionary –

+0

Да, я думал, что когда я писал последний комментарий, единственное, что заставило меня неуверенность в этой идее заключалась в том, что анимация отлично работает, когда она запускалась под триггером IsMouseOver, но я буду смотреть на это :) – Heinrich