IsEnabled和IsHitTestVisible覆盖Cursor设置为wait

时间:2016-02-15 15:39:14

标签: c# .net wpf

我正在编写一个WPF应用程序,有时我必须指出应用程序正忙,我想将光标设置为Wait(spinny事物),但我也想要普遍禁用与应用程序。

这适用于将光标设置为Wait

<UserControl.Style>
    <Style TargetType="UserControl">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsBusy}" Value="True">
                <Setter Property="ForceCursor" Value="True"/>
                <Setter Property="Cursor" Value="Wait"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsBusy}" Value="False">
                <Setter Property="ForceCursor" Value="False"/>
                <Setter Property="Cursor" Value="{x:Null}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Style>

但是当我尝试通过更改IsHitTestVisible来禁用整个应用程序时:

<DataTrigger Binding="{Binding IsBusy}" Value="True">
    <Setter Property="IsHitTestVisible" Value="False"/>
    <Setter Property="Cursor" Value="Wait"/>
    <Setter Property="ForceCursor" Value="True"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsBusy}" Value="False">
    <Setter Property="IsHitTestVisible" Value="True"/>
    <Setter Property="Cursor" Value="{x:Null}"/>
    <Setter Property="ForceCursor" Value="False"/>
</DataTrigger> 

如果我使用IsEnabled代替IsHitTestVisible

,光标就会变成箭头一样

据我了解,如果控件没有“点击可见”,它就不会设置光标,但我想不出一个很好的解决方法。

1 个答案:

答案 0 :(得分:1)

正如您注意到将IsHitTestVisible设置为true时,如果鼠标不在其上,则不允许您的窗口知道。因此,窗口不知道何时应该更改光标指示器。

然后我建议您使用解决方法:只需将Border 放在窗口内容上,然后让这个边框决定用户界面何时繁忙或不

这就是我的意思:在你的窗口中使用这个XAML

<Window x:Class="Application.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="400">
    <Grid>
        <Border Background="Transparent" BorderThickness="0"
                HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                Panel.ZIndex="100">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsBusy}" Value="True">
                            <Setter Property="Visibility" Value="Visible" />
                            <Setter Property="Cursor" Value="Wait" />
                            <Setter Property="ForceCursor" Value="True" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding IsBusy}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed" />
                            <Setter Property="Cursor" Value="Wait" />
                            <Setter Property="ForceCursor" Value="True" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>

        <StackPanel Orientation="Horizontal">
            <!-- Your Controls, i.e. your window's content -->
        </StackPanel>
    </Grid>
</Window>

正如您所看到的,Border的{​​{1}}比其他窗口的内容高ZIndex。当绑定属性IsBusytrue时,Border可见,并且不允许用户与窗口控件进行交互。

如果IsBusyfalse,则Border会折叠,一切正常。