ビデオ再生の進行状況に関する情報を得ることができないのに驚いています。しかし、UIをブロックせずにTask
とDispatcher
(クロススレッドのため)を組み合わせることで、以下のようにすることができます。
MainWindow.xaml.cs
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private CancellationTokenSource _tokenSource;
private double _start;
private double _stop;
public MainWindow()
{
InitializeComponent();
DataContext = this;
media.LoadedBehavior = MediaState.Manual;
Start = 0;
media.MediaOpened += (sender, args) =>
{
Stop = (int)media.NaturalDuration.TimeSpan.TotalSeconds;
SetEndPosition();
};
media.Source = new Uri("video.wmv", UriKind.Relative);
media.Play();
}
private async void SetEndPosition()
{
_tokenSource?.Cancel();
_tokenSource = new CancellationTokenSource();
var token = _tokenSource.Token;
await Task.Run(() =>
{
if (token.IsCancellationRequested)
return;
while (!token.IsCancellationRequested)
{
Dispatcher.Invoke(() =>
{
double position = media.Position.TotalSeconds;
if (position >= Stop)
SetStartPosition();
});
Thread.Sleep(100);
}
}, token);
}
private void SetStartPosition()
{
media.Position = TimeSpan.FromSeconds(Start);
}
public double Start
{
get { return _start; }
set { _start = value; OnPropertyChanged(); SetStartPosition(); }
}
public double Stop
{
get { return _stop; }
set { _stop = value; OnPropertyChanged(); }
}
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow"
Height="422"
Width="450">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="340" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<MediaElement Grid.Row="0" Grid.ColumnSpan="2" Margin="0,0,0,10" x:Name="media" />
<TextBox Grid.Row="1" Grid.Column="0" Text="{Binding Start}"></TextBox>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Stop}"></TextBox>
</Grid>
理由だけではなく、バウンドの変化を検出/イベントをキャッチしていませんプロパティの代わりにループ?チェックしていないが、確かにプレイヤーはPositionChangedイベントなどを持っている。 –
私はちょうどチェックし、私は何もPositionChangedイベントを見つけませんでした –
そうです... –