locked
スライダーを使って、メディアファイルのボリュームを変えたい RRS feed

  • 質問

  • いつもお世話になっております。

    スライダーコントロールによって、メディアのボリュームを変更するよう考えております。
    以下のようなものを作りましたが、ビルド自体は正常でも、ブラウザ確認で「Silverlight読み込み100%」表示のまま、ムービーは再生されません。

    xaml
    -------------------------------------------------------

    <MediaElement x:Name="movie" Source="media.wmx" Volume="0.5"/>
    <Slider x:Name="volumeSlider" Value="0.5" Maximum="1" Minimum="0" ValueChanged="VolumeChanged"/>

    -------------------------------------------------------

    page.xaml.cs
    -------------------------------------------------------

    public void VolumeChanged(object sender, EventArgs e)
    {
    movie.Volume = volumeSlider.Value;
    }

    -------------------------------------------------------

    どこが悪いのかサッパリ分かりません。
    ご教授いただけないでしょうか?
    • 移動 Wang Huang 2012年10月1日 9:44 (移動元:Silverlight - ビデオとメディア)
    2009年6月8日 9:35

回答

  • 早速試したところ、実現できました。
    ありがとうございました。

    私自身、C#スキルがまったく足らんようです。
    もっと勉強します。
    • 回答としてマーク ICHI_MASA 2009年6月15日 6:32
    2009年6月9日 4:22

すべての返信

  • MediaElementのインスタンスであるmovieオブジェクトがメディアを読み込むよりも前に、スライダーを操作してボリュームを設定した結果として、エラーが起きていると思います。
    デバッガで見たら、movie.Volume = の行で停止し、オブジェクトがNullだと思います。

    Silverlightでメディアや画像ファイルを使う際に気をつけなければならないのは、XAMLのロードが終わっていてもそれらのファイルの読み込みが終わっていない可能性があることです。
    メディアや画像の読み込みは非同期で行われるので、個別にMediaOpenedやImageOpenedのイベントで確認する必要があります。

    以下、Silverlight 3のコードで例示します。Silverlight 2でも同様な処理をすればいいだけです。それと、Sliderを(0, 1)の区間で設定すると操作が難しくなるかもしれません。
    ポイントは、MediaElementMediaOpenedイベントで正しくメディアが読み込まれていることを確認することです。

    MainPage.xaml
    <UserControl x:Class="SL3_MediaVolume01.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="Auto" Height="Auto">
        <Grid x:Name="LayoutRoot" Background="White">
            <Grid.RowDefinitions >
                <RowDefinition Height="0.9*"/>
                <RowDefinition Height="0.1*"/>
            </Grid.RowDefinitions>
            <MediaElement Grid.Row="0" x:Name="movie" Volume="0.5" Source="Shoe_Circus.wmv"/>
            <Slider Grid.Row="1" x:Name="volumeSlider" Value="5" Maximum="10" Minimum="0" ValueChanged="volumeSlider_ValueChanged"/>
    
        </Grid>
    </UserControl>
    MainPage.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    
    namespace SL3_MediaVolume01
    {
        public partial class MainPage : UserControl
        {
            private bool m_MediaOpened = false;
            public MainPage()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(MainPage_Loaded);
            }
    
            void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                movie.MediaOpened += new RoutedEventHandler(movie_MediaOpened);
            }
    
            void movie_MediaOpened(object sender, RoutedEventArgs e)
            {
                m_MediaOpened = true;
            }
    
            private void volumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                if (m_MediaOpened)
                {
                    movie.Volume = volumeSlider.Value/volumeSlider.Maximum;
                }
            }
        }
    }
    

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。
    • 回答の候補に設定 大西 彰 2009年6月9日 4:49
    2009年6月8日 10:08
  • 早速試したところ、実現できました。
    ありがとうございました。

    私自身、C#スキルがまったく足らんようです。
    もっと勉強します。
    • 回答としてマーク ICHI_MASA 2009年6月15日 6:32
    2009年6月9日 4:22