在不关闭子菜单的情况下打开子菜单时修改 WPF Window

Modify WPF Window when Submenu opens without closing Submenu

我有一个 Window 上面有一个 Menu。当 Menu 打开时,我想将 Window 的外观更改为看起来已禁用。简单地用灰色 Rectangle 覆盖它看起来不错。这是 Window 标记:

    <Grid>
        <!--Content-->
        <ContentControl Content="{Binding CurrentViewModel}" />
        <!--Container to hide content-->
        <Rectangle x:Name="Disabler" Fill="#77000000" Visibility="{Binding DisableWindow, Converter={StaticResource BoolToVisibilityConverter}}" />
    </Grid>

我试图在子菜单打开时将 DisableWindow 设置为 true,在关闭时设置为 false。但是,设置此值似乎会关闭子菜单。如何确保子菜单保持打开状态?

    private void MenuItem_SubmenuOpened(object sender, RoutedEventArgs e)
    {
        MainWindowViewModel mainVM = Window.GetWindow(this).DataContext as MainWindowViewModel;
        if (mainVM != null)
        {
            mainVM.DisableWindow = true;
        }
    }

编辑:由于 Rectangle 设置为可见,MouseUp 事件发生在 Disabler 上。这就是子菜单对我关闭的原因。我尝试在 Rectangle 上设置 IsHitTestVisible="False",但这使得它下面的所有内容都可以点击。有没有办法防止 Rectangle 偷走焦点?

我没有将网格与矩形重叠,而是将我的 2 分成两半。

  1. 是菜单栏(占屏幕的 10%)
  2. 矩形区域(屏幕的 90%)

屏幕

Xaml

 <Window x:Class="WpfApp4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp4"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d" x:Name="Window1"
    Title="MainWindow" Height="450" Width="800">

<Grid >
    <Grid.RowDefinitions>
        <RowDefinition Height="35"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Border>
        <Border.Effect>
            <BlurEffect Radius="{Binding ElementName=Window1,Path=DataContext.Radius}" KernelType="Gaussian"/>
        </Border.Effect>
        <Menu Grid.Row="0" x:Name="Menubar" HorizontalAlignment="Left" Height="24" Margin="10,10,0,0" VerticalAlignment="Top" Width="772"   >
            <MenuItem Header="Home" SubmenuOpened="MenuItem_SubmenuOpened" SubmenuClosed="MenuItem_SubmenuClosed" >
                <MenuItem Header="Office" >
                    <MenuItem Header="Ground Floor"/>
                </MenuItem>

                <MenuItem Header="Exit" />
            </MenuItem>
        </Menu>
    </Border>
    <Rectangle Grid.Row="1"  x:Name="Disabler" Fill="{Binding ElementName=Window1, Path=DataContext.BackGroundColor}"   />

</Grid>

如您在 Xaml 中所见,我使用了 2 个事件 SubmenuOpened 和 SubmenuClosed。 这2个方法负责翻转矩形填充画笔颜色。

在ViewModel/CodeBehind中,我创建了1个属性叫做BackGroundColor,当菜单没有被点击时它会是白色,如果我们点击菜单它会变成灰色。 BackGroundColor 将与 Rectangle 的 Fill 属性.

绑定

代码隐藏

     public partial class MainWindow : Window,INotifyPropertyChanged
{
    private Brush _backGroundcolor;

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public int _radius { get; set; }

    public int Radius
    {
        get
        {
            return _radius;
        }
        set
        {
            _radius = value;
            NotifyPropertyChanged(nameof(Radius));
        }
    }

    public Brush BackGroundColor
    {
        get
        {
            return _backGroundcolor;
        }
        set
        {
            _backGroundcolor = value;
            NotifyPropertyChanged(nameof(BackGroundColor));

        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private void MenuItem_SubmenuOpened(object sender, RoutedEventArgs e)
    {
        BackGroundColor = new SolidColorBrush(Colors.Gray);
        Radius = 5;
    }

    private void MenuItem_SubmenuClosed(object sender, RoutedEventArgs e)
    {
        BackGroundColor = new SolidColorBrush(Colors.White);
        Radius = 0;
    }
}

查看下面的菜单点击图片。

我不得不在 Rectangle 上设置 IsHitTestVisible="False",尽管这会使它下面的所有内容都可以点击。这是一个 hack,我希望有更好的修复。