我正在用 C# WPF 开发一个应用程序,我想加载图像来显示。但代码无法将图像放入框架。当我运行我的应用程序时,将没有音频。我不添加LoadedBehavior和UnloadedBehavior并删除按钮单击功能中的所有代码将运行良好。但我想通过点击按钮来控制音乐的播放和停止。我想动态控制音乐。我想知道我遇到了什么问题。
这是我的主要 C# 代码,第二个是 XAML 代码。
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace test_WPF;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private MediaElement music;
public MainWindow()
{
InitializeComponent();
music = (MediaElement) FindName("MyMusic");
music.LoadedBehavior = MediaState.Manual;
music.UnloadedBehavior = MediaState.Stop;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (music == null)
{
return;
}
try
{
if (music.HasAudio)
{
if (music.CanPause)
{
music.Pause();
}
else
{
music.Play();
}
}
else if (music.HasVideo)
{
MessageBox.Show("It's Video");
}
else
{
MessageBox.Show("No Audio");
}
}
catch (Exception exception)
{
Console.WriteLine(exception.ToString());
}
}
}
<Window x:Class="test_WPF.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"
xmlns:local="clr-namespace:test_WPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<MediaElement
Source="res/BGM.flac"
Name="MyMusic"></MediaElement>
<Button
Width="40"
Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Click="ButtonBase_OnClick"
Margin="0 100">Click</Button>
</Grid>
</Window>
我使用.Net 8.0.112。
媒体加载后,MediaElement.CanPause 会告知 MediaElement 是否支持暂停,在调用 MediaElement.Play() 或 MediaElement.Pause() 方法时它不会更改。
为了让您的代码正常工作,您可以引入一个代表音乐媒体元素状态的布尔字段:
private MediaElement music;
private bool isMusicPlaying = false;
然后用它来确定是播放还是暂停并相应地设置状态:
if (isMusicPlaying)
{
music.Pause();
isMusicPlaying = false;
}
else
{
music.Play();
isMusicPlaying = true;
}
System.Windows.Controls MediaElement 不会公开任何告诉其当前状态的公共属性,但您可以使用反射来获取它,如本答案所示: