在不关闭子菜单的情况下打开子菜单时修改 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 分成两半。
- 是菜单栏(占屏幕的 10%)
- 矩形区域(屏幕的 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,我希望有更好的修复。
我有一个 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 分成两半。
- 是菜单栏(占屏幕的 10%)
- 矩形区域(屏幕的 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,我希望有更好的修复。