WPF Custom Control EventTrigger не срабатывает или анимация не работает


Я пытаюсь создать настраиваемый элемент управления (это просто настраиваемая сетка, полученная из сетки, я хотел бы сохранить ее как сетку из-за нескольких других вещей, которые я хочу попробовать), мой вопрос: почему не t раскадровка работает, когда я пытаюсь запустить ее из EventTrigger, но отлично работает при обычном триггере, мой код приведен ниже:

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

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

Мой пользовательский элемент управления является производным от сетки.

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

используя System.Windows; using 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);
        }    
    }
}

person Heinrich    schedule 12.04.2013    source источник
comment
Анимация отлично работает для стандартного Grid. Есть ли что-нибудь в производной сетке, что мешает событиям мыши? Вы пробовали RoutedEvent="Grid.MouseRightButtonDown"?   -  person sa_ddam213    schedule 12.04.2013
comment
Насколько я могу судить нет, я явно не добавил ничего, что могло бы помешать: / Но что касается его работы в сетке с обычным стилем, я видел, что он действительно работает, поэтому, вероятно, я немного сбит с толку, так как почему это вдруг не работает.   -  person Heinrich    schedule 12.04.2013
comment
Я просто настраиваю производную сетку, и анимация там тоже отлично работает. Не могли бы вы опубликовать код из производной сетки, у нее есть собственный шаблон?   -  person sa_ddam213    schedule 12.04.2013
comment
Я добавил остальной код :)   -  person Heinrich    schedule 12.04.2013
comment
Я копирую и вставляю ваш производный класс, и анимация работает нормально, есть ли PreviewMouseRightButtonDown в вашем главном окне где-то, отменяя это.   -  person sa_ddam213    schedule 12.04.2013
comment
Теперь я просто сбит с толку: / в банкомате нет окон, он только добавляет сетку в окно. есть ли способ пройти через анимацию и посмотреть, что происходит?   -  person Heinrich    schedule 12.04.2013
comment
Комментарий перед этим может немного сбить с толку: P Окно пустое, за исключением настраиваемого элемента сетки :) И нет, предварительного просмотра тоже нет. Я также изменил расположение кода (т.е. был в отдельной сборке ini. Но я переместил его), но все равно безрезультатно   -  person Heinrich    schedule 12.04.2013
comment
Я разместил свой тестовый код ниже, если он помогает, попробуйте скопировать, вставив его, и посмотрите, работает ли он на вашей стороне   -  person sa_ddam213    schedule 12.04.2013


Ответы (1)


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);
        }
    }
}
person sa_ddam213    schedule 12.04.2013
comment
Это действительно работает, но только потому, что стиль определен в Windows.Resources, если вы должны создать настраиваемый элемент управления и иметь код в Generic.xaml, я не думаю, что это сработает: / Срабатывает триггер при наведении мыши, но не событие. Когда код находится в файле Generic.xaml. - person Heinrich; 12.04.2013
comment
Тогда похоже, что вы не загрузили generic.xaml в ресурсы приложения должным образом, Generic.xaml не отличается от любого другого ResourceDictionary - person sa_ddam213; 12.04.2013
comment
Да, я думал, что, когда я писал последний комментарий, единственное, что заставляло меня сомневаться в этой идее, было то, что анимация работает нормально, когда она запускалась под триггером IsMouseOver, но я обязательно посмотрю на это :) - person Heinrich; 12.04.2013