wpf

2010-10-30 37 views
8

में मीडियामेमेंट में एक प्रोग्रेसबार को बाध्य करना C#/wpf में मैंने अपनी विंडो में एक प्रगतिबार और मीडियालेमेंट जोड़ा। विचार यह था कि प्रगति पट्टी प्रदर्शित कर रही है कि मीडियालेमेंट में कितना खेला गया है।wpf

मैं निम्नलिखित XAML के साथ इसे करने की कोशिश:

<Window x:Class="TestApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="627" Width="889"> 
    <Grid> 
    <MediaElement Margin="152,8,140,41" Name="mediaElement1" MediaEnded="mediaElement1_MediaEnded" Visibility="Hidden" /> 
    <ProgressBar Height="23" Margin="152,8,10,0" Name="mp3PlayingProgressBar" VerticalAlignment="Top" Foreground="DarkBlue" Maximum="{Binding Path=NaturalDuration.TimeSpan.TotalSeconds, Mode=OneWay, ElementName=mediaElement1}" Value="{Binding Path=Position.TotalSeconds, Mode=OneWay, ElementName=mediaElement1}" /> 
    </Grid> 
</Window> 

मैं अधिकतम और मूल्य MediaElement के लिए संपत्ति के लिए बाध्य करने की कोशिश की। लेकिन जब मैं मीडियालेमेंट में उदाहरण के लिए एमपी 3 लोड करता हूं, तो प्रगति पट्टी के साथ कुछ भी खुश नहीं होता है। (संगीत बज रहा है इसलिए एमपी 3 लोड हो गया है और सही ढंग से खेल रहा है)।

मैं इसे बाध्यकारी के साथ करना पसंद करता हूं।

मैं यहाँ क्या गलत कर रहा हूं?

उत्तर

10

ऐसा इसलिए है क्योंकि मीडिया खोला नहीं गया है और इसलिए प्रगति पट्टी अधिकतम मूल्य से अवगत नहीं है। इसे आज़माएं ...

मीडिया ओपेन के लिए निम्न घटनाओं का उपयोग करें, और अपनी प्रगति पट्टी या स्लाइडर के लिए MouseLeftButtonUp का उपयोग करें। मैंने कोशिश की, और यह ठीक काम करता है।

public partial class AudioPage : Page 
{ 
    TimeSpan _position; 
    DispatcherTimer _timer = new DispatcherTimer(); 

    public AudioPage() 
    { 
     InitializeComponent(); 
     _timer.Interval = TimeSpan.FromMilliseconds(1000); 
     _timer.Tick += new EventHandler(ticktock); 
     _timer.Start(); 
    } 

    void ticktock(object sender, EventArgs e) 
    { 
     sliderSeek.Value = media.Position.TotalSeconds; 
    } 

    // Executes when the user navigates to this page. 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 

    private void Play_Click(object sender, RoutedEventArgs e) 
    { 
     media.Play(); 
    } 

    private void Pause_Click(object sender, RoutedEventArgs e) 
    { 
     media.Pause(); 
    } 

    private void Stop_Click(object sender, RoutedEventArgs e) 
    { 
     media.Stop(); 
    } 

    private void media_MediaOpened(object sender, RoutedEventArgs e) 
    { 
     _position = media.NaturalDuration.TimeSpan; 
     sliderSeek.Minimum = 0; 
     sliderSeek.Maximum = _position.TotalSeconds; 
    } 

    private void sliderSeek_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     int pos = Convert.ToInt32(sliderSeek.Value); 
     media.Position = new TimeSpan(0, 0, 0, pos, 0); 
    } 
} 

सहयोगी XAML के रूप में इस प्रकार है ...

<Grid x:Name="LayoutRoot" Background="#FFFFE8E8"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="220*" /> 
     <RowDefinition Height="75*" /> 
    </Grid.RowDefinitions> 
    <MediaElement Height="189" HorizontalAlignment="Left" Margin="12,12,0,0" Name="media" VerticalAlignment="Top" Width="399" Source="anyfile.mp3" AutoPlay="True" MediaOpened="media_MediaOpened" /> 
    <StackPanel Orientation="Horizontal" Grid.Row="1" Height="30" Margin="12,8,163,37"> 
     <TextBlock Text="Volume" VerticalAlignment="Center"></TextBlock> 
     <Slider Margin="2" Maximum="1" Minimum="0" Width="102" Value="{Binding Path=Volume, Mode=TwoWay, ElementName=media}"></Slider> 
     <TextBlock Text="{Binding ElementName=media, Path=Volume, Mode=OneWay, StringFormat=0.00}" VerticalAlignment="Center" /> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Grid.Row="1" Height="30" Margin="26,47,163,-2"> 
     <TextBlock Text="Seek" VerticalAlignment="Center"></TextBlock> 
     <Slider Margin="2" Width="104" Name="sliderSeek" MouseLeftButtonUp="sliderSeek_MouseLeftButtonUp"></Slider> 
     <TextBlock Text="{Binding ElementName=sliderSeek, Path=Value, StringFormat=0}" VerticalAlignment="Center"></TextBlock> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Grid.Row="1" Height="30" Margin="266,8,12,37"> 
     <Button Name="Play" Content="Play" Margin="2" Click="Play_Click" /> 
     <Button Name="Pause" Content="Pause" Margin="2" Click="Pause_Click" /> 
     <Button Name="Stop" Content="Stop" Margin="2" Click="Stop_Click" /> 
    </StackPanel> 
</Grid> 
+0

आप एक टाइमर के साथ मूल्य अपडेट कर रहे हैं। मैं इसे बाध्यकारी के साथ करने की इच्छा रखी। क्या यह संभव नहीं है? –

+1

मैं वास्तव में यह नहीं कह सकता कि यह संभव है या नहीं। लेकिन मैंने यह समाधान लिखा क्योंकि मैं इसे बाध्यकारी के साथ काम नहीं कर पाया था।मुझे एहसास हुआ कि यह मुद्दा हो रहा था क्योंकि मीडिया खोला नहीं जा रहा था और मैंने यह कोड लिखना चुना। कोई मुझे सही कर सकता है, और एक बेहतर समाधान प्रदान कर सकता है। मैं इस धागे पर ट्यून रहूंगा। –

0

सिर्फ इस उदाहरण को देखो - प्रगति के बजाय वह स्लाइडर इस्तेमाल किया ...

एक WPF स्लाइडर के लिए पूर्वावलोकन व्यवहार अटैच किया जा रहा नियंत्रण

http://jobijoy.blogspot.com/2009/07/attaching-preview-behavior-to-wpf.html

4

मैं वी बाध्य करने की कोशिश की संकेत और इसके बिना आया, लेकिन सफलता के बिना:

<ProgressBar 
    x:Name="testProgressBar" Minimum="0" 
    Maximum="{Binding NaturalDuration.TimeSpan.TotalSeconds, ElementName=mediaPlayer}" 
    Value="{Binding Position.TotalSeconds, ElementName=mediaPlayer, Mode=OneWay}" /> 

बहुत बुरा यह काम नहीं करता है।
मुझे डर है कि आपको एक टाइमर सेट अप की आवश्यकता होगी।
कुछ की तरह:

* .xaml

<ProgressBar x:Name="testProgressBar" /> 

* .cs

public MainWindow() 
    { 
     InitializeComponent(); 
     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += timer_Tick; 
     timer.Start(); 
    } 
    private void timer_Tick(object sender, EventArgs e) 
    { 
     if (mediaPlayer.Source != null && mediaPlayer.NaturalDuration.HasTimeSpan) 
     { 
      testProgressBar.Minimum = 0; 
      testProgressBar.Maximum = mediaPlayer.NaturalDuration.TimeSpan.TotalSeconds; 
      testProgressBar.Value = mediaPlayer.Position.TotalSeconds; 
     } 
    } 

सधन्यवाद,
Thimo।

+2

नहीं? मैंने कोशिश की कि व्यक्ति क्या जानना चाहता है, जो काम नहीं करता है, इसलिए मैंने इस सवाल का विकल्प दिया। एक जो काम करता है और इसका असर पड़ता है कि एक प्रश्न पूछने की इच्छा है, नहीं? मैं केवल मदद के लिए अनुरोध करने में सहायता करने की कोशिश करता हूं, और मेरी आंखों में यह एक जवाब है। इसे अच्छी तरह से पढ़ें। माइक्रोसॉफ्ट द्वारा किए गए कुछ अजीब फैसलों के कारण मीडिया प्लेयर में सीधे उस समय के मूल्य को बांधना संभव नहीं है, जो सीधे प्रगति पट्टी पर हो गया है। –

+1

यह एक उत्तर है, और वास्तव में एक अच्छा है! मेरे पास ओपी का बिल्कुल मामला था और इस जवाब ने हल किया ठीक से काम किया कि मैं इसे अपने समाधान के लिए कैसे चाहता था। :) – Milkncookiez

0

बार स्लाइडिंग करते समय मीडिया की स्थिति के वास्तविक वास्तविक समय परिवर्तन के साथ राहुल के नमूने का एक WPF संस्करण।

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     _timer.Interval = TimeSpan.FromMilliseconds(1000); 
     _timer.Tick += new EventHandler(ticktock); 
     _timer.Start(); 

     Open(@"filename.mp3"); 
    } 
    public void Open(string fileName) 
    { 
     var uriPath = "file:///" + fileName.Replace("\\", "/"); 
     media.Source=new Uri(uriPath); 
    } 

    TimeSpan _position; 
    DispatcherTimer _timer = new DispatcherTimer(); 

    void ticktock(object sender, EventArgs e) 
    { 
     if (!sliderSeek.IsMouseCaptureWithin) 
      sliderSeek.Value = media.Position.TotalSeconds; 
    } 

    private void Play_Click(object sender, RoutedEventArgs e) 
    { 
     media.Play(); 
    } 

    private void Pause_Click(object sender, RoutedEventArgs e) 
    { 
     media.Pause(); 
    } 

    private void Stop_Click(object sender, RoutedEventArgs e) 
    { 
     media.Stop(); 
    } 

    private void media_MediaOpened(object sender, RoutedEventArgs e) 
    { 
     _position = media.NaturalDuration.TimeSpan; 
     sliderSeek.Minimum = 0; 
     sliderSeek.Maximum = _position.TotalSeconds; 
    } 

    private void sliderSeek_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    {   
     int pos = Convert.ToInt32(sliderSeek.Value); 
     media.Position = new TimeSpan(0, 0, 0, pos, 0); 
    } 

    private void sliderSeek_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     if (sliderSeek.IsMouseCaptureWithin) 
     { 
      int pos = Convert.ToInt32(sliderSeek.Value); 
      media.Position = new TimeSpan(0, 0, 0, pos, 0); 
     } 
    } 
} 
0

GitHub में Gu.Wpf.Media नामक एक आवरण पुस्तकालय कि MediaElement की सभी समस्याओं को संभालती है और अधिक लाता है।

यह Position संपत्ति को TwoWay बॉक्स से बाहर बाध्यकारी के माध्यम से बाध्यकारी का समर्थन करता है। टाइमर के साथ परेशानी की कोई ज़रूरत नहीं है।