System.Windows.Interactivity.EventTrigger в codebehind работает на некоторых элементах управления, но не на других - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть приложение, в которое я добавляю элементы управления во время выполнения и хочу прикрепить EventTrigger (s) , которые PlaySoundAction .В XAML это легко, но с необходимостью генерировать элементы управления на лету и добавлять эти триггеры становится немного сложнее.

Я задал предыдущий вопрос и смог получитьОтчасти, и с недавним тестированием я пришел к выводу, что я могу сделать, чтобы решить эту проблему, но надеялся, что, возможно, что-то мне не хватает.Я могу заставить EventTrigger работать с элементом управления Button, но не на RegularPolygon , и я не могу выбрать простой способ встраивания кнопки в RegularPolygon для достижения желаемых результатов, потому что этоне является ContentControl.

Это то, что у меня в настоящее время есть этот метод для добавления новых RegularPolygons в контейнер (Canvas):

public RegularPolygon AddShape(Panel container)
{
    RegularPolygon shape = new RegularPolygon();

    // ShapeColors is a List<SolidColorBrush> that has been prepopulated
    // _random is a Random() from .NET
    shape.Fill = ShapeColors[_random.Next(0, ColorCount - 1)];
    shape.Stretch = Stretch.Fill;
    shape.PointCount = _random.Next(3, 6);
    shape.UseLayoutRounding = false;
    shape.Stroke = new SolidColorBrush(Colors.Black);
    shape.Width = _random.Next(50, 150);
    shape.Height = _random.Next(50, 150);
    // UI_Tap is an arbitrary function for handling the Tap event
    shape.Tap += UI_Tap;

    System.Windows.Interactivity.EventTrigger trigger = new System.Windows.Interactivity.EventTrigger("Tap");
    PlaySoundAction correct = new PlaySoundAction();
    correct.Source = new Uri("/Sounds/Correct.mp3", UriKind.RelativeOrAbsolute);
    correct.Volume = 1;

    trigger.Actions.Add(correct);

    //Button b = new Button();
    //b.Content = "This is button B";
    //System.Windows.Interactivity.Interaction.GetTriggers(b).Add(trigger);
    //container.Children.Add(b);

    // Comment this line out when uncommenting Button b block because Triggers 
    // can only be associated with one element
    System.Windows.Interactivity.Interaction.GetTriggers(shape).Add(trigger);

    Canvas.SetLeft(shape, _random.Next((int)(shape.Width / 2), (int)(container.Width - (shape.Width / 2))));
    Canvas.SetTop(shape, _random.Next((int)(shape.Height / 2), (int)(container.Height - (shape.Height / 2))));
    container.Children.Add(shape);

    return shape;
}

Я вижу, что все мои RegularPolygons появляются на экране.Я проверил, чтобы убедиться, что путь к звуковому файлу работает, когда другие тестовые элементы управления пытаются ссылаться на него в указанном месте.Не повезло заставить работать EventTrigger с PlaySoundAction.Если я раскомментирую линии вокруг кнопки b, я вижу добавленную кнопку и нажимаю на нее, чтобы услышать воспроизведение звука.

Я могу заставить RegularPolygon работать с PlaySoundAction EventTrigger в XAML следующим образом:

<es:RegularPolygon x:Name="haxx" Fill="#FFF4F4F5" Height="100" InnerRadius="1" Canvas.Left="125" PointCount="5" Stretch="Fill" Stroke="Black" Canvas.Top="187" UseLayoutRounding="False" Width="100">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Tap">
            <eim:PlaySoundAction Source="/Sounds/Correct.mp3"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</es:RegularPolygon>

Моим грядущим решением будет создание пользовательского элемента управления, который позволит мне использовать форму RegularPolygon с функциональностью Button, поскольку я могу заставить это работать из codebehind.Что-то, чего мне не хватает, мешает мне работать с EventTrigger?

1 Ответ

0 голосов
/ 06 января 2012

Это был случай, когда в заданном вопросе недостаточно информации.У метода UI_Tap (...) было несколько целей:

  • Воспроизвести звук при нажатии на RegularPolygon
  • Определить, нужно ли выводить на экран больше объектов (чтобы избежать запускаиз всего, что можно потрогать)
  • Удалите Tap'd RegularPolygon из родительского контейнера

Что получилось, так это удаление объекта из родительского контейнера, и мне сразу же не пришло в голову, что мойобъект не сможет выполнить связанный с ним EventTrigger.Именно поэтому жесткое кодирование в RegularPolygon на MainPage.xaml работало так же, как и кнопка выше, из-за того, что я никогда не пытался удалить их из обработчика событий Tap.

У меня были некоторые предложения связыванияEventTrigger для PlaySoundAction для ManipulationStartedEvent, потому что это происходит до события Tap, и это будет работать, но я собираюсь пойти по более сложному пути использования библиотек XNA для воспроизведения SoundEffect во время цикла обновления.Он включает создание IApplicationLifetimeService и создание очередей звуков для воспроизведения в событии FrameDispatchTimer_Tick, например:

FrameworkDispatcher.Update не был вызван и что с этим делать

...