PDA

View Full Version : سوال: ساختن seekbar برای کنترل فیلم



هاجر22
یک شنبه 13 شهریور 1390, 19:28 عصر
سلام من برای صفحه ای که طراحی کرده ام از media element استفاده کرده ام. تمام کنترل های لازم را هم برای آن تنظیم کرده ام ولی زمانی که یک اسلایدر برای کنترل موقعیت فیلم قرار می دهم و ان را به position نصبت می دهم کار نمی کند لطفا من را راهنمایی کنید

B.I.O.H.A.Z.A.R.D
سه شنبه 15 شهریور 1390, 22:42 عصر
کد خودتون رو قرار بدید، ببینیم ایراد چیه

هاجر22
سه شنبه 15 شهریور 1390, 23:15 عصر
سلام. در این صفحه یک کادر متنی هست که موقعیت مدیا را نشان می دهد. همچنین از منابع برنامه هم برای تبدیل نوع هم استفاده کردم ولی فایده ای نداشت.
این هم کد برنامه :

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:seekbar" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:System="clr-namespace:System;assembly=mscorlib"
x:Class="seekbar.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Window.Resources>
<local:DoubleToIntegerValueConverter x:Key="DoubleToIntegerValueConverter"/>
<local:IntegerToDoubleValueConverter x:Key="IntegerToDoubleValueConverter"/>
</Window.Resources>

<Grid x:Name="LayoutRoot">
<MediaElement x:Name="mediaElement" Margin="170,41,172,192" Source="01AZARESTOON.MP3"/>
<Slider x:Name="slider" Height="26" Margin="187,0,232,134" VerticalAlignment="Bottom" Value="{Binding Position.Seconds, Converter={StaticResource IntegerToDoubleValueConverter}, ElementName=mediaElement, Mode=OneWay}" Maximum="{Binding NaturalDuration.TimeSpan.Seconds, Converter={StaticResource IntegerToDoubleValueConverter}, ElementName=mediaElement, Mode=OneWay}">
<i:Interaction.Triggers>
<ei:PropertyChangedTrigger Binding="{Binding Value, ElementName=slider}">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=mediaElement}" PropertyName="Position" TargetName="mediaElement" Value="{Binding Value, Converter={StaticResource DoubleToIntegerValueConverter}, ElementName=slider, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
</Slider>
<TextBlock HorizontalAlignment="Right" Height="51" Margin="0,0,61,109" TextWrapping="Wrap" Text="{Binding NaturalDuration.HasTimeSpan, ElementName=mediaElement, Mode=OneWay}" VerticalAlignment="Bottom" Width="111"/>
<TextBox HorizontalAlignment="Right" Height="48" Margin="0,153,22,0" TextWrapping="Wrap" Text="{Binding Position.Seconds, ElementName=mediaElement, Mode=OneWay}" VerticalAlignment="Top" Width="103"/>
<Button Content="Play" HorizontalAlignment="Left" Height="49.5" Margin="62.5,60,0,0" VerticalAlignment="Top" Width="81">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=mediaElement}" PropertyName="LoadedBehavior">
<ei:ChangePropertyAction.Value>
<MediaState>Play</MediaState>
</ei:ChangePropertyAction.Value>
</ei:ChangePropertyAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</Window>

B.I.O.H.A.Z.A.R.D
چهارشنبه 16 شهریور 1390, 13:37 عصر
این ها کد xaml هستند و بنده این رو نخواسته بودم :لبخند:

ببینید شما یه اسلایدر بندازید روی صفحه. و در قسمت کد، توی رویداد تیک مربوط به تایمر،، برای اینکه این اسلایدر بخواد موقعیت فیلم لود شده رو نشون بده، این کد رو بنویسید:

private void timer_Tick(object sender, EventArgs e)
{
if (playing) // a boolean variable which indicates whether the movie is playing or not
{
positionSlider.Value =
moviePlayer.Position.TotalMilliseconds;
}
}

این تکه کد رو هم در رویداد ValueChanged مربوط به اسلایدر بنویسید:

private void positionSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
moviePlayer.Position = new TimeSpan(0, 0, 0, 0, (int)positionSlider.Value);
}


در رویداد MediaOpened مربوط به کنترل MediaElement هم این کد رو بنویسید تا مقدار max این اسلایدر شما به درستی نشان داده بشه و تایمر هم حرکت کنه:

private void moviePlayer_MediaOpened(
object sender, RoutedEventArgs e)
{
// Set the media's starting Volume to the current
// value of the slider control.
moviePlayer.Volume = (double)volumeSlider.Value;
positionSlider.Maximum =
moviePlayer.NaturalDuration.TimeSpan.TotalMillisec onds;

// Update the position slider every second.
timer.Interval = new TimeSpan(0, 0, 1);
timer.Start();
}

اگه بازم متوجه نشدید، بگید کل پروژه ای که دارم رو براتون بصورت کامل قرار بدم.

هاجر22
چهارشنبه 16 شهریور 1390, 15:53 عصر
سلام ممنون از راهنمایی تون ولی حقیقتش من دارم از blend استفاده می کنم و منظورتون رو از تیک مربوط به تایمر نمی دانم (آیا باید خودم یک تایمر را راه بیندازم یا اینکه هنگام لود شدن خود تایمر وجود دارد. )

B.I.O.H.A.Z.A.R.D
چهارشنبه 16 شهریور 1390, 17:15 عصر
درسته که از blend استفاده میکنید. ولی blend برای طراحی خوبه. برنامه شما در اکثر موقع به کد نویسی هم احتیاج داره.

تایمر رو بصورت زیر تعریف کنید:
private System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();

و برای تعریف رویداد تیک اون کد زیر رو بنویسید:

timer.Tick += new EventHandler(timer_Tick);


همه ی اینها توی فایل

xaml.cs.*

نوشته بشه.

هاجر22
چهارشنبه 16 شهریور 1390, 20:25 عصر
سلام من روش شما عمل کردم و اسلایدر متناسب با فیلم حرکت می کند ولی مشکلی که وجود دارد این است که زمانی که اسلایدر را جابجا می کنم فیلم متناسب با آن تغییر نمی کند. و بعد از این که اسلایدر را جابجا کردم دیگر همزمان با فیلم تغییر نمی کند و ثابت می ماند. در ضمن من یک کادر متنی در صفحه قرار داده ام و مقدار آن را برابر با position فیلم قرار دادم ولی مقدار آن همیشه صفر است. در حالی که فیلم در حال نمایش است.

B.I.O.H.A.Z.A.R.D
چهارشنبه 16 شهریور 1390, 23:28 عصر
این رویداد رو نوشتید؟؟

private void positionSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
moviePlayer.Position = new TimeSpan(0, 0, 0, 0, (int)positionSlider.Value);
}



در ضمن مقداری که به لیبل انتساب میدید باید کدش درون رویداد تیک تایمر باشه. یعنی هر لحظه آپدیت بشه تا بتونه مقدار صحیح رو نشون بده.

هاجر22
پنج شنبه 17 شهریور 1390, 00:27 صبح
راستش الان که دوباره نگاه میکنم در مورد صوت مشکلی نیست ولی زمان پخش فیلم زمانی که اسلایدر را تغییر می دهم حدود 27 ثانیه با تاخیر عمل می کند و پس از این زمان به درستی کار می کند.

B.I.O.H.A.Z.A.R.D
پنج شنبه 17 شهریور 1390, 09:44 صبح
دلیل این مورد رو نمیدونم والا. ولی برای اسلایدر این event رو تعریف کردید مثل کد زیر:

<Slider Grid.Row="1" Name="positionSlider" Minimum="0" Maximum="1" Margin="2" ValueChanged="positionSlider_ValueChanged"/>

چون طبیعتا بدون مشکل باید کار کنه.

راستی دکمه های forward و backward هم دارید؟ کارشونم اینه که مثلا 5 ثانیه ویدیو رو جلو/عقب ببره. اگه ندارین اونم کدش رو بذارم.

هاجر22
پنج شنبه 17 شهریور 1390, 14:26 عصر
نیکی و پرسش؟ اگه بذارید که ممنون می شم:لبخندساده:

B.I.O.H.A.Z.A.R.D
پنج شنبه 17 شهریور 1390, 15:29 عصر
اولی واسه 5 ثانیه عقب رفتن. دومی برای 5 ثانیه جلو رفتن.

private void backButton_Click(object sender, RoutedEventArgs e)
{
moviePlayer.Position = moviePlayer.Position.Subtract(new TimeSpan(0, 0, 0, 0, 5000));
positionSlider.Value = moviePlayer.Position.TotalMilliseconds;
}

private void forwardButton_Click(object sender, RoutedEventArgs e)
{
moviePlayer.Position = moviePlayer.Position.Add(new TimeSpan(0, 0, 0, 0, 5000));
positionSlider.Value = moviePlayer.Position.TotalMilliseconds;
}

راستی مشکل قبلی حل شد؟؟

هاجر22
پنج شنبه 17 شهریور 1390, 22:28 عصر
نه هنوز عملیات با تاخیر انجام می شود. در واقع زمان پخش فیلم قطعی داره یعنی هر چند ثانیه یکبار فیلم یک توقف کوتاه داره

B.I.O.H.A.Z.A.R.D
جمعه 18 شهریور 1390, 10:16 صبح
والا دیگه چیزی به ذهنم نمیرسه. اگر خواستید پروژتون رو کامل قرار بدید تا یه فکری به حالش بکنیم :)