我有一个按钮,当用户单击它时。我想根据其启用和禁用状态播放不同的声音。我也想在控制级别上做到这一点,以便可以在整个应用程序中重复使用
下面是当前代码,启用后可以正常工作。禁用后如何播放声音
<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>
答案 0 :(得分:1)
控件被禁用时不会获得鼠标事件。这就是“禁用”的意思。
但是,如果禁用该选项,则可视父级将获得一个PreviewMouseDown事件,前提是该父级完全获得了任何鼠标事件。这样我们就可以将Button包裹在Grid中,让Grid播放“ disabled”状态声音。
有点难看。我敢肯定有一种更简洁的方法可以做到这一点:也许您可以编写一个附加到Button的Behavior,并在附加行为时创建Grid并将其插入Button和它的直接父级之间。但是我只是测试了一下,它可以工作。
我唯一担心的是预览鼠标按下事件总是发生在父项上。在这里的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>