3

最初の投稿なので、優しくて長い投稿で申し訳ありませんが、できる限り詳細を提供したかった.

LoadedBehaviour プロパティが手動に設定された usercontrol 内に MediaElement コントロールがあります。以下を参照してください。「開く」ボタンをクリックすると、ハンドラ コードにメディアの再生が含まれるため、MediaOpened イベント ハンドラで期間プロパティを準備できます。これは正常に実行されます。MediaOpened ハンドラーは、メディアの長さが必要なときに再生を停止します。

また、プログラムの開始時にプレイリストをロードし、データグリッドに情報を入力したいと考えています。1 つの要素はメディアの長さです。

XAML

    <MediaElement Grid.Row="5" Name="MediaEL" Grid.ColumnSpan="6" MediaOpened="MediaEL_MediaOpened"  LoadedBehavior="Manual" Height="169" />

    <DataGrid Grid.Row="1" Grid.ColumnSpan="6"  Name="dgPlayList" AutoGenerateColumns="False" Height="300" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Position}" Header="#" Width="30"/>
            <DataGridTextColumn Binding="{Binding Title}" Header="Title" Width="182"/>
            <DataGridTextColumn Binding="{Binding Time}" Header="Time" Width="50"/>
            <DataGridCheckBoxColumn Binding="{Binding Dnp}" Header="Dnp" Width="35"/>
            <DataGridTextColumn Binding="{Binding Location}" Visibility="Hidden" />
        </DataGrid.Columns>
    </DataGrid>

C#

    private void btnOpen_Click(object sender, RoutedEventArgs e)  
    {  
        System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();  

        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)  
        {  
            MediaEL.Source = new Uri(ofd.FileName);
            btnPlay.IsEnabled = true;
            MediaEL.Visibility = Visibility.Hidden;
            SettingTime = true;
            MediaEL.Play();
        }
    }

    private void MediaEL_MediaOpened(object sender, RoutedEventArgs e)
    {
        if (MediaEL.NaturalDuration.HasTimeSpan)
        {
            TimeSpan ts = MediaEL.NaturalDuration.TimeSpan;
            Length.Content = FormatLength(ts.TotalSeconds);  // make it look like 00:00:00
            seekBar.Maximum = ts.TotalSeconds;
            seekBar.SmallChange = 1;
            seekBar.LargeChange = Math.Min(10, ts.Seconds / 10);
        }
        if (!SettingTime)
            timer.Start();
        else
        {
            SettingTime = false;
            MediaEL.Stop();
            MediaEL.Visibility = Visibility.Visible;
            MediaEL.Close();
        }
    }

dgPlayList.ItemsSource = LoadPlayListData();

ウィンドウロードメソッドで呼び出されます。
foreachステートメントの下のメソッドで、機能するまでコメントアウトしました。

ここでの問題は、メディアの長さを取得してデータグリッドの時間列を埋めようとすると、MediaOpened イベントが発生せず、理由がわからず、件名の検索が使い果たされていることです。
どんな考えでも大歓迎です!
ありがとう、ジム

C#

    private ObservableCollection<PlayListEntry> LoadPlayListData()
    {
        var playListEntries = new ObservableCollection<PlayListEntry>();
        var position = 1;
        var bPlay = false;

        var doc = new XmlDocument();
        doc.Load(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + @"/mpcplaylist.xml");

        var root = doc.DocumentElement;
        var nodes = root.SelectNodes("/playlist/media");

        XmlNode node = nodes[0];

        if (node.InnerXml.Contains("title"))
        {
            var xmlElement = node["title"];
            if (xmlElement != null)
                Title = xmlElement.InnerText;
        }

        if (node.InnerXml.Contains("artist"))
        {
            var xmlElement = node["artist"];
            if (xmlElement != null)
                Artist = xmlElement.InnerText;
        }

        if (node.InnerXml.Contains("location"))
        {
            var xmlElement = node["location"];
            if (xmlElement != null)
                Location = xmlElement.InnerText;
        }

        if (node.InnerXml.Contains("include"))
        {
            var xmlElement = node["include"];
            if (xmlElement != null)
                Include = xmlElement.InnerText;
        }

        if (Include == "No")
            bPlay = true;
        else
            bPlay = false;

        //foreach (XmlNode node in nodes)
        //{
        //    if (node.InnerXml.Contains("title"))
        //    {
        //        var xmlElement = node["title"];
        //        if (xmlElement != null)
        //            Title = xmlElement.InnerText;
        //    }

        //    if (node.InnerXml.Contains("artist"))
        //    {
        //        var xmlElement = node["artist"];
        //        if (xmlElement != null)
        //            Artist = xmlElement.InnerText;
        //    }

        //    if (node.InnerXml.Contains("location"))
        //    {
        //        var xmlElement = node["location"];
        //        if (xmlElement != null)
        //            Location = xmlElement.InnerText;
        //    }

        //    if (node.InnerXml.Contains("include"))
        //    {
        //        var xmlElement = node["include"];
        //        if (xmlElement != null)
        //            Include = xmlElement.InnerText;
        //    }

        //    if (Include == "No")
        //        bPlay = true;
        //    else
        //        bPlay = false;


            MediaEL.Source = new Uri(Location);

            SettingTime = true;

            MediaEL.Play();

            Medialength = Length.Content.ToString();

            playListEntries.Add(new PlayListEntry()
            {
                Dnp = bPlay,
                Position = position++,
                Time = Medialength,
                Title = Title,
                Location = Location
            });


        //}

        return playListEntries;
    }
4

2 に答える 2

2

解決策は...

xml プレイリストから最初のエントリを取得し、source プロパティを設定してから、play メソッドを呼び出して再生時間を取得します。次に、Media Opened イベントで、次のエントリを取得し、リスト内のすべてのメディア アイテムのデュレーションが得られるまで同じことを行います。

これが、最初のエントリが処理された後にメディア オープン イベントが次のエントリを取得するための鍵でした。

とはいえ、スレッドとコントロールには別の問題がありますが、そのための新しい投稿を作成します。

ありがとう、ジム

于 2013-03-14T11:11:15.160 に答える
0

MediaPlayerさて、私はあなたの問題の私のバージョンに対する完全な解決策を見つけることができませんでしたが、オブジェクトで私の問題を引き起こしている原因を特定しました。私のアプリケーション(および内部メディアプレーヤー)はすべて正常に機能していましたが、オーディオを含むフォルダーのアクセス許可が変更された後、機能しなくなりました。

読み取りアクセスのみを許可するようにフォルダーが変更されたため、mediaPlayerはファイルにアクセスできたはずです。ただし、ファイルを開くには、より高いレベルのアクセス許可が必要であるように見えました。メソッドを使用してこれをテストWindowsIdentity.Impersonateし、メソッドの呼び出しに完全なアクセス許可を与えましたMediaPlayer.Openが、変更はありませんでした。

最後に、ローカルファイルシステム上のオーディオファイルのパスをMediaPlayer.Openメソッドに渡してみましたが、すべて以前と同じように機能しました。たぶん、この最後のステップを試して、問題がセキュリティ権限によっても引き起こされているかどうかを確認する必要があります。

更新>>

うん、それは許可エラーであることが判明した。IT部門が私のアクセス権を台無しにしたため、MediaPlayer(または私のアクセス権を継承したアプリケーション)がオーディオファイルを開くことができませんでした。私に正しい権利を与えた後、はMediaPlayer再びうまく機能し始めました。

これがお役に立てば幸いです。

于 2013-02-19T14:19:26.377 に答える