У меня есть приложение, в которое я добавляю элементы управления во время выполнения и хочу прикрепить 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?