none
MediaElementをコードで扱ってる時にvolumeが変更できない

    質問

  • MediaElementを操作を一元化したく読み込みなどをクラス化して、MediaElement自体はコード上で宣言(変数)して使用しているのですが。

    いくつかのページにわたって使用する(鳴らしたままにする)ためApp.csで実体化させて使用しています。

    App.csでパブリックでクラス実体化して、soundElement.LoadElement();

    ロード自体は

    public MediaElement _MediaElement;

    MediaElement = await SoundElemtLib.LoadSoundElement("~", false, true);

    のような形

    ページからは(Application.Current as App).soundElement._MediaElement.Playで再生等

    Play、Stopは可能で再生できることは確認できているのですが、volumeの変更、positionの変更が反映されません。

    ページ上にXAMLで宣言したMediaElementはvolume変更、position変更ともにできるので、MediaElementを変数で使用した場合に起きるのですが、

    自分のクラス設計がおかしいのかと思い、ページの.csに直接読み込みなどを書いてMediaElementを変数で操作しても同じように変更が反映されませんでした。

    また、Child.Addでページに所属させた場合、Playもきかなくなりました。

    この現象の回避方法をご存知の方はいらっしゃいませんでしょうか?

    よろしくお願いいたします。

    2013年6月28日 1:47

回答

  • 自分で確認していないので申し訳ないのですが、こちらのスレッドで似たような事象が議論されています。

    Media Events not Firing if instantiated from function

    MediaElement の各イベントが発火する前にVisual TreeにMediaElementが属していないと、イベントの発火が起きないと記述されています。

    XAMLの中でMediaElementを定義した場合、自然とVisual Treeに属することになりますが、C# のコードの中でインスタンス化すると自分で処理しない限りそうならないはずです。

    ページ遷移した場合に移動元(移動して見えなくなった)ページに属するMediaElementは停止する、とも記述されているので、どうも同じMediaElementを複数のページで使いまわすのは想定していないのでは、と想像します。

    2013年7月6日 17:47

すべての返信

  • 自分で確認していないので申し訳ないのですが、こちらのスレッドで似たような事象が議論されています。

    Media Events not Firing if instantiated from function

    MediaElement の各イベントが発火する前にVisual TreeにMediaElementが属していないと、イベントの発火が起きないと記述されています。

    XAMLの中でMediaElementを定義した場合、自然とVisual Treeに属することになりますが、C# のコードの中でインスタンス化すると自分で処理しない限りそうならないはずです。

    ページ遷移した場合に移動元(移動して見えなくなった)ページに属するMediaElementは停止する、とも記述されているので、どうも同じMediaElementを複数のページで使いまわすのは想定していないのでは、と想像します。

    2013年7月6日 17:47
  • 自分で確認していないので申し訳ないのですが、こちらのスレッドで似たような事象が議論されています。

    Media Events not Firing if instantiated from function

    MediaElement の各イベントが発火する前にVisual TreeにMediaElementが属していないと、イベントの発火が起きないと記述されています。

    XAMLの中でMediaElementを定義した場合、自然とVisual Treeに属することになりますが、C# のコードの中でインスタンス化すると自分で処理しない限りそうならないはずです。

    ページ遷移した場合に移動元(移動して見えなくなった)ページに属するMediaElementは停止する、とも記述されているので、どうも同じMediaElementを複数のページで使いまわすのは想定していないのでは、と想像します。

    そういった制限ですか、厳しい制限ですね。

    MSにチケットを使用して問い合わせたとしても仕様で終わりそうな気がするので、そういうものだと認識するしかないですかね。

    XAudio2での実装を考えたほうがいいかもしれないですが、MediaElementで出来ればC#で実装してるのできれいに収まるのがうれしいんですが。

    ご回答ありがとうございます。

    2013年7月7日 1:10