Изменить окно WPF при открытии подменю без закрытия подменю - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть 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 установлен на Visible, событие MouseUp происходит на Disabler.Вот почему Подменю закрывается на меня.Я попытался установить IsHitTestVisible = "False" на Rectangle, но это делает все под ним кликабельным.Есть ли способ удержать Rectangle от кражи фокуса?

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Мне пришлось пойти с установкой IsHitTestVisible = "False" на прямоугольнике, хотя это делает все под ним кликабельным.Это хак, и я бы с удовольствием поправил.

0 голосов
/ 04 декабря 2018

Вместо того, чтобы перекрывать сетку прямоугольником, я разделил мои 2 половины.

  1. Является ли строка меню (10% экрана)
  2. Область прямоугольника (90% экрана)

enter image description here

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

Проверьте изображение, выбранное в меню ниже.enter image description here

...