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

时间:2019-06-20 12:39:13

标签: wpf

我有一个按钮,当用户单击它时。我想根据其启用和禁用状态播放不同的声音。我也想在控制级别上做到这一点,以便可以在整个应用程序中重复使用

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

<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>

1 个答案:

答案 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>