绑定按钮 Mediaelement
Bind button Mediaelement
我有一个视频想要连接 Play/Paus/Stop 个按钮。
在我看来我的代码是这样的:
<MediaElement Source="{Binding MediaUri}" LoadedBehavior="Manual" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" />
<Button x:Name="Play" Height="20" Width="40" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}"/>
我的按钮应该在点击时播放视频,但没有任何反应。
在我的视图模型中,我有播放按钮的代码,当我点击按钮时,我进入调试模式,但没有任何反应。
public class MoviePlayerViewModel : TreeViewBase<MoviesViewModel>
{
public MoviePlayerViewModel(IDispatcherWrapper dispatcher, IViewManager viewManager, IKeyboardSimulator keyboardSimulator, IToggleInputManager toggleInputManager)
: base(dispatcher, viewManager, keyboardSimulator, toggleInputManager)
{
UpdateGuards();
ReadMediaFile();
// Show course viewer at start
IsIndexVisible = true;
}
public void Play(object sender, NavigationEventArgs e)
{
MediaElement mediaElement = new MediaElement();
mediaElement.Source = MediaUri;
mediaElement.LoadedBehavior = MediaState.Manual;
mediaElement.Play();
}
private Uri _mediaUri;
public Uri MediaUri
{
get
{
return _mediaUri;
}
set
{
_mediaUri = value;
NotifyOfPropertyChange(() => MediaUri);
NotifyOfPropertyChange(() => IsIndexVisible);
}
}
当我现在点击按钮时,我进入了 Play 方法,但没有任何反应。
我正在使用 C# WPF 和 Caliburn micro。
您在 XAML 中定义的 MediaElement 绑定了 MediaUri。因此,它会在分配 MediaUri 后立即播放。要解决此问题,您需要将 LoadedBehavior 设置为 XAML.
LoadedBehavior="Manual"
完整代码。
<MediaElement Source="{Binding MediaUri}" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" LoadedBehavior="Manual" />
要使用 MediaElement 和 MVVM(在您的情况下是 Caliburn Micro)播放文件,需要做更多的工作。
在 ViewModel 中
您需要声明一个 OnPlay 事件,并在您的播放方法中调用它。
public event EventHandler OnPlay;
public void Play()
{
if(OnPlay!=null)
this.OnPlay(this, EventArgs.Empty);
}
在视图中,
为您的视图添加加载事件
Loaded="Window_Loaded"
在代码隐藏文件中,
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var viewModelInstance = DataContext;
(viewModelInstance as MainWindowViewModel).OnPlay += (s, ev) => { this.MediaPlayer.Play(); };
}
其中 MediaPlayer 是您的 MediaElement 的 x:Name。
由于 MediaElement 不允许我们从 ViewModel 播放文件,因此我们在 View 中创建了一个 hack 解决方案。您在 View 中创建一个事件,该事件在分配给您的 Button 的 Play 方法上触发。视图依次播放媒体文件。
我有一个视频想要连接 Play/Paus/Stop 个按钮。 在我看来我的代码是这样的:
<MediaElement Source="{Binding MediaUri}" LoadedBehavior="Manual" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" />
<Button x:Name="Play" Height="20" Width="40" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}"/>
我的按钮应该在点击时播放视频,但没有任何反应。
在我的视图模型中,我有播放按钮的代码,当我点击按钮时,我进入调试模式,但没有任何反应。
public class MoviePlayerViewModel : TreeViewBase<MoviesViewModel>
{
public MoviePlayerViewModel(IDispatcherWrapper dispatcher, IViewManager viewManager, IKeyboardSimulator keyboardSimulator, IToggleInputManager toggleInputManager)
: base(dispatcher, viewManager, keyboardSimulator, toggleInputManager)
{
UpdateGuards();
ReadMediaFile();
// Show course viewer at start
IsIndexVisible = true;
}
public void Play(object sender, NavigationEventArgs e)
{
MediaElement mediaElement = new MediaElement();
mediaElement.Source = MediaUri;
mediaElement.LoadedBehavior = MediaState.Manual;
mediaElement.Play();
}
private Uri _mediaUri;
public Uri MediaUri
{
get
{
return _mediaUri;
}
set
{
_mediaUri = value;
NotifyOfPropertyChange(() => MediaUri);
NotifyOfPropertyChange(() => IsIndexVisible);
}
}
当我现在点击按钮时,我进入了 Play 方法,但没有任何反应。
我正在使用 C# WPF 和 Caliburn micro。
您在 XAML 中定义的 MediaElement 绑定了 MediaUri。因此,它会在分配 MediaUri 后立即播放。要解决此问题,您需要将 LoadedBehavior 设置为 XAML.
LoadedBehavior="Manual"
完整代码。
<MediaElement Source="{Binding MediaUri}" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" LoadedBehavior="Manual" />
要使用 MediaElement 和 MVVM(在您的情况下是 Caliburn Micro)播放文件,需要做更多的工作。
在 ViewModel 中
您需要声明一个 OnPlay 事件,并在您的播放方法中调用它。
public event EventHandler OnPlay;
public void Play()
{
if(OnPlay!=null)
this.OnPlay(this, EventArgs.Empty);
}
在视图中,
为您的视图添加加载事件
Loaded="Window_Loaded"
在代码隐藏文件中,
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var viewModelInstance = DataContext;
(viewModelInstance as MainWindowViewModel).OnPlay += (s, ev) => { this.MediaPlayer.Play(); };
}
其中 MediaPlayer 是您的 MediaElement 的 x:Name。
由于 MediaElement 不允许我们从 ViewModel 播放文件,因此我们在 View 中创建了一个 hack 解决方案。您在 View 中创建一个事件,该事件在分配给您的 Button 的 Play 方法上触发。视图依次播放媒体文件。