Linq To Xml assigning attributes to click events
-
26-10-2019 - |
Question
I making a soundboard as an exercise for myself. I want to parse the URIs from an XML file and bind them to a single mediaelement. I have eight buttons that I want to trigger different audio files. I only have one page so I can't use NavigationContext.QueryString to pass an attribute id as a querystring to LINQ. How can I change the attribute depending on what button I press?
Here's the code:
Audio Class:
public class AudioClass
{
string audio;
public string Audio
{
get { return audio; }
set { audio = value; }
}
}
Code:
public partial class MainPage : PhoneApplicationPage
{
string name = "C";
public MainPage()
{
InitializeComponent();
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
XDocument audioPlayer = XDocument.Load("Audio.xml");
var aani = (from audio in audioPlayer.Descendants("Note")
where audio.Attribute("id").Value == name
select new AudioClass
{
Audio = (string)audio.Element("url").Value
}).SingleOrDefault();
player.Source = new Uri(aani.Audio, UriKind.Relative);
base.OnNavigatedTo(e);
}
private void C_Key_Click(object sender, RoutedEventArgs e)
{
player.Play();
}
private void D_Key_Click(object sender, RoutedEventArgs e)
{
player.Play();
}
And XAML:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="41,-8,-17,8">
<Button x:Name="C_key" Content="" HorizontalAlignment="Left" Height="220" Margin="8,0,0,8" Style="{StaticResource C}" VerticalAlignment="Bottom" Width="75" Click="C_Key_Click"/>
<Button x:Name="D_key" Content="" HorizontalAlignment="Left" Height="220" Margin="87,0,0,8" Style="{StaticResource D}" VerticalAlignment="Bottom" Width="75" Click="D_Key_Click"/>
<Button x:Name="E_key" Content="" HorizontalAlignment="Left" Height="220" Margin="166,0,0,8" Style="{StaticResource E}" VerticalAlignment="Bottom" Width="75" Click="E_Key_Click"/>
<Button x:Name="F_key" Content="" HorizontalAlignment="Left" Height="220" Margin="245,0,0,8" Style="{StaticResource F}" VerticalAlignment="Bottom" Width="75" d:LayoutOverrides="Width" Click="F_Key_Click"/>
<Button x:Name="G_key" Content="" Height="220" Margin="324,0,305,8" Style="{StaticResource G}" VerticalAlignment="Bottom" Click="G_Key_Click"/>
<Button x:Name="A_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,226,8" Style="{StaticResource A}" VerticalAlignment="Bottom" Width="75" Click="A_Key_Click"/>
<Button x:Name="B_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,147,8" Style="{StaticResource B}" VerticalAlignment="Bottom" Width="75" Click="B_Key_Click"/>
<Button x:Name="C2_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,68,8" Style="{StaticResource C2}" VerticalAlignment="Bottom" Width="75" Click="C2_Key_Click"/>
<MediaElement Height="120" HorizontalAlignment="Left" Margin="8,6,0,0" Name="player" VerticalAlignment="Top" Width="160" Source="{Binding Audio}" Volume="1" AutoPlay="False"/>
</Grid>
Solution
- Extract
SetPlayerSource()
fromOnNavigatedTo()
. Use
SetPlayerSource()
in generic button click event handler.protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { SetPlayerSource(); base.OnNavigatedTo(e); } private void SetPlayerSource() { XDocument audioPlayer = XDocument.Load("Audio.xml"); var aani = (from audio in audioPlayer.Descendants("Note") where audio.Attribute("id").Value == name select new AudioClass { Audio = (string)audio.Element("url").Value }).SingleOrDefault(); player.Source = new Uri(aani.Audio, UriKind.Relative); } private void ButtonKey_Click(object sender, RoutedEventArgs e) { var buttonName = (sender as Button).Name; var underscorePos = buttonName.IndexOf('_'); name = buttonName.Substring(0, underscorePos); SetPlayerSource(); player.Play(); }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow