C# 使用NAudio在WPF上创建音频播放器。装订不';行不通

C# 使用NAudio在WPF上创建音频播放器。装订不';行不通,c#,wpf,naudio,C#,Wpf,Naudio,我正在WPF上使用创建音频播放器。 我正在添加一个将滚动歌曲的滑块。 XAML: 问题:当歌曲播放时,滑块属性值不会改变!但是,通过滚动滑块的拇指,MediaReader的属性Position会发生变化。 为什么会这样?我如何解决这个问题?请看一下本教程: 作者还使用滑块控件并绑定当前轨迹位置,例如: <Slider Grid.Column="0" Minimum="0" Maximum="{Binding CurrentTrackLenght, Mode=OneWay}" Value=

我正在WPF上使用创建音频播放器。
我正在添加一个将滚动歌曲的
滑块。
XAML:

问题:当歌曲播放时,滑块属性
不会改变!但是,通过滚动滑块的拇指,
MediaReader的属性
Position
会发生变化。

为什么会这样?我如何解决这个问题?

请看一下本教程:

作者还使用滑块控件并绑定当前轨迹位置,例如:

<Slider Grid.Column="0" Minimum="0" Maximum="{Binding CurrentTrackLenght, Mode=OneWay}" Value="{Binding CurrentTrackPosition, Mode=TwoWay}" x:Name="SeekbarControl" VerticalAlignment="Center">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseDown">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseDownCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="PreviewMouseUp">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseUpCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Slider>

public double CurrentTrackPosition
    {
        get { return _currentTrackPosition; }
        set
        {
            if (value.Equals(_currentTrackPosition)) return;
            _currentTrackPosition = value;
            OnPropertyChanged(nameof(CurrentTrackPosition));
        }
    }

公共双轨定位
{
获取{return\u currentTrackPosition;}
设置
{
if(value.Equals(_currentTrackPosition))返回;
_currentTrackPosition=值;
OnPropertyChanged(名称(CurrentTrackPosition));
}
}

我想你可以理解这背后的想法……

只要看看本教程:

作者还使用滑块控件并绑定当前轨迹位置,例如:

<Slider Grid.Column="0" Minimum="0" Maximum="{Binding CurrentTrackLenght, Mode=OneWay}" Value="{Binding CurrentTrackPosition, Mode=TwoWay}" x:Name="SeekbarControl" VerticalAlignment="Center">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseDown">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseDownCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="PreviewMouseUp">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseUpCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Slider>

public double CurrentTrackPosition
    {
        get { return _currentTrackPosition; }
        set
        {
            if (value.Equals(_currentTrackPosition)) return;
            _currentTrackPosition = value;
            OnPropertyChanged(nameof(CurrentTrackPosition));
        }
    }

公共双轨定位
{
获取{return\u currentTrackPosition;}
设置
{
if(value.Equals(_currentTrackPosition))返回;
_currentTrackPosition=值;
OnPropertyChanged(名称(CurrentTrackPosition));
}
}

我想你可以理解这背后的想法…

mediareader没有发送更改通知,因此UI无法更新。@Alejandro,谢谢!也许我应该创建一个计时器,并且每个刻度都会更新滑块?您需要将模型包装在一个实现INotifyPropertyChanged的视图模型中interface@BorisMakhlin不过,这是一个选项,这将严重影响CPU的使用。在库的文档中查找通知您的内容,例如更新位置的事件或回调。使用更新绑定的行为如何?mediareader没有发送更改通知,因此无法更新UI。@Alejandro,谢谢!也许我应该创建一个计时器,并且每个刻度都会更新滑块?您需要将模型包装在一个实现INotifyPropertyChanged的视图模型中interface@BorisMakhlin不过,这是一个选项,这将严重影响CPU的使用。在库的文档中查找通知您的内容,例如更新位置的事件或回调。使用更新绑定的行为如何?
<Slider Grid.Column="0" Minimum="0" Maximum="{Binding CurrentTrackLenght, Mode=OneWay}" Value="{Binding CurrentTrackPosition, Mode=TwoWay}" x:Name="SeekbarControl" VerticalAlignment="Center">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseDown">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseDownCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="PreviewMouseUp">
                        <i:InvokeCommandAction Command="{Binding TrackControlMouseUpCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Slider>

public double CurrentTrackPosition
    {
        get { return _currentTrackPosition; }
        set
        {
            if (value.Equals(_currentTrackPosition)) return;
            _currentTrackPosition = value;
            OnPropertyChanged(nameof(CurrentTrackPosition));
        }
    }