如何根据按钮的启用和禁用状态在按钮单击时播放不同的声音



>我有一个按钮,当用户点击它时。我想根据其启用和禁用状态播放不同的声音。我还想在控制级别执行此操作,以便可以在整个应用程序中重用它

下面是当前代码,启用后工作正常。禁用时如何播放声音

<Button Width="100" Height="60" Content="Click">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="PreviewMouseDown">
<SoundPlayerAction Source="Sounds/LogOnSuccessful.wav" />
</EventTrigger>
</Style.Triggers>
</Style>
</Button.Style> 
</Button>

控件在禁用时不会获取鼠标事件。这就是"残疾"的意思。

但是,当它被禁用时,如果父级获得任何鼠标事件,则视觉父级将获得 PreviewMouseDown 事件。因此,我们可以将按钮包装在网格中,让网格播放"禁用"状态声音。

有点丑。我相信有一种看起来更干净的方法可以做到这一点:也许你可以编写一个附加到按钮的行为,当附加时,它会创建网格并将其插入按钮及其直接父级之间。但我刚刚测试了这个,它有效。

我脑海中唯一担心的是预览鼠标按下事件总是转到父级。在我的Windows 10机器上,一次只能播放一种声音,而且我没有得到父声音,所以实际上这不是问题 - 在这台机器上,现在测试我的小测试项目。如有必要,您可以为网格提供一个事件,用于检查按钮是否已启用。

<StackPanel>
<CheckBox
Content="Enable"
x:Name="EnableCheckBox"
/>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<EventTrigger RoutedEvent="PreviewMouseDown">
<SoundPlayerAction Source="Sounds/LogOnFailed.wav" />
</EventTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Button
x:Name="Button"
IsEnabled="{Binding IsChecked, ElementName=EnableCheckBox}"
Content="Button"
>
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="PreviewMouseDown">
<SoundPlayerAction Source="Sounds/LogOnSuccessful.wav" />
</EventTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</StackPanel>

最新更新