2016-03-27 1 views
2

J'apprends actuellement C# et WPF. Par conséquent, je suis en train de programmer un petit lecteur de musique. Mais maintenant je suis arrivé à un problème. Je mettais en œuvre des cadres différents pour les éléments de menu et d'autres choses que je montre.Comment puis-je interagir avec une propriété dans un autre cadre? (C#/WPF)

Ensuite, mon problème est apparu. J'ai un MediaElement dans mon MainWindow.XAML (.CS) et je dois interagir avec cet élément aussi dans mon Player.XAML (.CS) - qui le contrôle évidemment (le joueur peut mettre en pause, jouer, arrêter, etc le MediaElement) . L'autre classe CurrentPlaylist.XAML (.CS) affiche la liste de lecture en cours dans une Datagrid. Il affiche des informations et peut interagir avec MediaElement (Réglage d'un nouveau morceau/Démarrer pour lire la chanson).

Je n'ai vraiment aucune idée sur la façon de l'atteindre quand j'ai des cadres différents.

Voici un peu de code.

MainWindow.xaml

<Grid> 
    <MediaElement Name="media" HorizontalAlignment="Left" Width="1" Height="1" LoadedBehavior="Manual" UnloadedBehavior="Stop" 
    MediaOpened="Element_MediaOpened" MediaEnded="Element_MediaEnded"/> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 


    <Frame Width="1280" Height="100" Grid.ColumnSpan="2" Grid.Row="1" VerticalAlignment="Bottom" Source="Player.xaml"></Frame> 

    <StackPanel HorizontalAlignment="Left" Width="50" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" Name="fullMenu" Background="{StaticResource flavorColor}" > 
     <Button Style="{StaticResource seeThrough}" Width="50" Height="70" x:Name="hamburgerMenu" Grid.Column="0" Grid.Row="0" BorderBrush="{x:Null}" Click="hamburger_Click" Cursor="Hand" HorizontalAlignment="Right"> 
      <Rectangle Width="30" Height="30"> 
       <Rectangle.Fill> 
        <DrawingBrush> 
         <DrawingBrush.Drawing> 
          <DrawingGroup> 
           <DrawingGroup.Children> 
            <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" /> 
            <GeometryDrawing Brush="White" Geometry="F1M13,11L3,11 3,13 13,13z M13,7L3,7 3,9 13,9z M13,5L3,5 3,3 13,3z" /> 
           </DrawingGroup.Children> 
          </DrawingGroup> 
         </DrawingBrush.Drawing> 
        </DrawingBrush> 
       </Rectangle.Fill> 
      </Rectangle> 

     </Button> 

     <Button Click="default_Playlist_Click" x:Name="item1" Style="{StaticResource seeThrough}" Content="{Binding CurrentPlaylist.Name}" Visibility="Collapsed"></Button> 

     <Button Click="playlist_List_Click" x:Name="item2" Style="{StaticResource seeThrough}" Content="Playlists" Visibility="Collapsed"></Button> 

     <Button Click="full_Player_Click" x:Name="item3" Style="{StaticResource seeThrough}" Content="MaxPlayer" Visibility="Collapsed"></Button> 
    </StackPanel> 
</Grid> 

Player.XAML

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 



    <Slider x:Name="timeLine" Grid.Column="0" VerticalAlignment="Center"/> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal" Grid.Column="1" Grid.Row="2"> 

     <Button x:Name="previousSong" Width="75" Height="30" Margin="10,0,10,20"> 
      &lt;&lt; 
     </Button> 
     <Button Click="PlayPause" x:Name="playSong" Width="75" Height="30" Margin="10,0,10,20"> 
      || 
     </Button> 
     <Button x:Name="nextSong" Width="75" Height="30" Margin="10,0,10,20"> 
      &gt;&gt; 
     </Button> 
    </StackPanel> 
</Grid> 

Player.XAML.cs

public partial class Player : Page 
{ 

    private TimeSpan TotalTime; 
    DispatcherTimer timer; 
    private bool playerRunning = false; 
    private MainWindow mw; 
    MediaElement Media; 

    public Player(MainWindow mw) 
    { 
     this.mw = mw; 
     Media = mw.Media; 
     InitializeComponent(); 

     timeLine.AddHandler(MouseLeftButtonUpEvent, 
        new MouseButtonEventHandler(SeekMediaPosition), 
        true); 

     timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += new EventHandler(timer_Tick); 
    } 


    public void timer_Tick(object sender, EventArgs e) 
    { 
     timeLine.Value = timeLine.Value + 1000; 
    } 

    private void PlayPause(object sender, RoutedEventArgs e) 
    { 
     if (Media.Source != null && playerRunning == true) 
     { 

      Media.Pause(); 
      playSong.Content = ">"; 
      playerRunning = false; 
     } 
     else if (Media.Source != null && playerRunning == false) 
     { 
      Media.Play(); 
      playSong.Content = "||"; 
      playerRunning = true; 
     } 
    } 

    private void Element_MediaOpened(object sender, EventArgs e) 
    { 
     timeLine.Maximum = Media.NaturalDuration.TimeSpan.TotalMilliseconds; 
     TotalTime = Media.NaturalDuration.TimeSpan; 
     timer.Start(); 

    } 


    private void Element_MediaEnded(object sender, EventArgs e) 
    { 
     Media.Stop(); 
    } 

    private void SeekMediaPosition(object sender, MouseButtonEventArgs args) 
    { 
     int val = (int)timeLine.Value; 
     Media.Position = new TimeSpan(0, 0, 0, 0, val); 
    } 
} 

Ce fut ma dernière idée. Mais bon, je pensais que ça ne marcherait pas.

J'apprécierais que vous donniez un petit coup de pouce à la réponse. :)

+0

"ne fonctionne pas" n'est pas informatif du tout! –

+0

Puisqu'il s'agit d'un nouvel objet et qu'il ne met pas à jour le MediaElement dans ma MainWindow, il ne change rien. – horoTV

Répondre

1

Je ne suis pas tout à fait sûr de ce que vous voulez dire par les cadres, ce qui peut être le problème. Mais, cela a fonctionné pour moi.

' Configure open file dialog box 
Dim dlg As New Microsoft.Win32.OpenFileDialog() 
dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) & "iTunes\iTunes Media\Music" 
dlg.FileName = "" ' Default file name 
dlg.DefaultExt = ".txt" ' Default file extension 
'dlg.Filter = "Music file (.mp3)|*.mp3;(.mp4)|*.mp4" ' Filter files by extension 
dlg.Filter = "Music file (.mp3,.m4a)|*.mp3;*.m4a" ' Filter files by extension 

' Show open file dialog box 
Dim result? As Boolean = dlg.ShowDialog() 

' Process open file dialog box results 
If result = True Then 
    ' Open document 
    Dim filename As String = dlg.FileName 
    Dim baseUri As New Uri(filename) 
    'MsgBox(filename) 

    myMediaElement.Stop() 
    myMediaElement.Source = baseUri 
    myMediaElement.Play() 

End If 

Aussi, j'ai décidé de cesser d'utiliser l'élément multimédia tous ensemble parce que WMP (En fait, toutes les technologies Windows Media. Je viens de le désinstaller.) Est rien, mais un problème lorsque vous l'utilisez avec iTunes. Lorsque j'essaie ma prochaine, je vais utiliser un paquet que j'ai trouvé, trouver facilement un dans Outils -> Gestionnaire de paquets Nuget -> Gérer les paquets NuGet pour la solution. Rechercher quelque chose comme un lecteur audio/musique.

Celui que j'ai trouvé, et était génial pour les bips sonores, s'appelait NAudio.

+0

Je voulais dire Pages, que je montre dans WPF en les reliant en tant que cadres. Exemple: horoTV

+0

cadres jamais utilisés comme ça, en fait, je ne l'ai jamais utilisé pages. –