2016-03-27 13 views
2

Ich lerne gerade C# und WPF. Deshalb programmiere ich einen kleinen Musikplayer. Aber jetzt kam ich zu einem Problem. Ich habe verschiedene Rahmen für Menüeinträge und andere Dinge implementiert, die ich zeige.Wie kann ich mit einer Eigenschaft in einem anderen Frame interagieren? (C#/WPF)

Dann kam mein Problem auf. Ich habe ein MediaElement in meinem MainWindow.XAML (.CS) und ich muss mit diesem Element auch in meinem Player.XAML (.CS) interagieren - der es offensichtlich steuert (der Spieler kann das MediaElement anhalten, abspielen, stoppen usw.) . Die andere Klasse CurrentPlaylist.XAML (.CS) zeigt die aktuelle Playlist in einem Datagrid an. Es zeigt Informationen an und kann mit dem MediaElement interagieren (Einstellen eines neuen Songs/Start, um den Song abzuspielen).

Ich habe wirklich keine Ahnung, wie ich es erreichen kann, wenn ich verschiedene Frames habe.

Hier ist ein bisschen 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); 
    } 
} 

Dies war meine letzte Idee. Aber gut, wie ich dachte, es wird nicht funktionieren.

Ich würde mich freuen, wenn Sie Jungs einen kleinen Stachel auf die Antwort geben würde. :)

+0

"wird nicht funktionieren" ist überhaupt nicht informativ! –

+0

Da es ein neues Objekt ist und das MediaElement in meinem MainWindow nicht aktualisiert, ändert es nichts. – horoTV

Antwort

1

Ich bin nicht ganz sicher, was Sie mit Frames meinen, so dass das Problem sein kann. Aber das hat für mich funktioniert.

' 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 

Auch habe ich beschlossen, alle zusammen mit dem Medienelement zu stoppen, weil WMP (Eigentlich alles Windows Media-Tech. Ich kann es nur deinstallieren.) Ist nichts anderes als ein Problem, wenn Sie es mit iTunes verwenden. Wenn ich mein nächstes versuche, werde ich ein Paket verwenden, das ich gefunden habe, leicht zu finden in Tools -> Nuget-Paket-Manager -> NuGet-Pakete für Lösung verwalten. Suchen Sie nach etwas wie Audio/Musik-Player.

Die eine, die ich fand, und war großartig für Tastentöne, hieß NAudio.

+0

Ich meinte Seiten, die ich in WPF anzeigen, indem ich sie als Frames verlinke. Beispiel: horoTV

+0

nie verwendet Frames wie das in der Tat habe ich noch nie Seiten. –