Показывать диалог в меню и предотвращать закрытие меню / диалога щелчками не на элементах управления диалогового окна - PullRequest
1 голос
/ 12 марта 2019

У меня есть MenuItem.Когда я нажимаю на элемент, я хочу открыть подменю MenuItem и показать форму для входа в систему.

В соответствии с тем, что я уже сделал (не стесняйтесь полностью переделать это) ... Проблема сейчас:

  • при наведении курсора мыши или щелчке по подпункту элемент выделяется.
  • при нажатии на элемент (кроме текстового поля) меню закрывается.

Спасибо за вашу помощь!

<MenuItem>
            <MenuItem.Header>
                <Image
                    Width="16"
                    Height="16">
                    <Image.Style>
                        <Style TargetType="{x:Type Image}">
                            <Setter Property="Source" Value="{StaticResource DisconnectedIcon}" />
                            <Style.Triggers>
                                <DataTrigger Value="True" Binding="{Binding Connected}">
                                    <Setter Property="Source" Value="{StaticResource ConnectedIcon}"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Image.Style>
                </Image>
            </MenuItem.Header>
            <autogrid:AutoGrid
                Columns="Auto,Auto"
                Margin="1"
                RowHeight="25">
                <autogrid:AutoGrid.Resources>
                    <Style TargetType="{x:Type TextBox}">
                        <Setter Property="Margin" Value="3" />
                        <Setter Property="Width" Value="100" />
                    </Style>
                    <Style TargetType="{x:Type PasswordBox}">
                        <Setter Property="Margin" Value="3" />
                        <Setter Property="Width" Value="100" />
                    </Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Margin" Value="3" />
                        <Setter Property="Width" Value="100" />
                    </Style>
                </autogrid:AutoGrid.Resources>
                <TextBlock Text="System: "/>
                <TextBox></TextBox>
                <TextBlock Text="Username: "/>
                <TextBox></TextBox>
                <TextBlock Text="Password: "/>
                <PasswordBox></PasswordBox>
            </autogrid:AutoGrid>
            <Button Content="Connect"/>
        </MenuItem>

1 Ответ

0 голосов
/ 12 марта 2019

Я рекомендую сделать ваши элементы управления входом частью нового окна.

И для всех, кто следует за вами, вам нужно запустить Install-Package WpfAutoGrid -Version 1.4.0 в консоли диспетчера пакетов.

Для дальнейшего использования, пожалуйста, оставьте МИНИМАЛЬНЫЙ и полный пример.У меня ушло больше времени, чем нужно, чтобы бросить все это вместе.

Пожалуйста, прочитайте «Как создать минимальный, полный и проверяемый пример»

Вот мой пример MCVE:

connect

disconnect

MainWindow.xaml:

<Window x:Class="WpfApp1.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:autogrid="clr-namespace:WpfAutoGrid;assembly=WpfAutoGrid"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="500">
    <Window.DataContext>
        <local:VM/>
    </Window.DataContext>
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem>
                <MenuItem.Header>
                    <Image
                    Width="16"
                    Height="16">
                        <Image.Style>
                            <Style TargetType="{x:Type Image}">
                                <Setter Property="Source" Value="{StaticResource DisconnectedIcon}" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Connected}" Value="true">
                                        <Setter Property="Source" Value="{StaticResource ConnectedIcon}"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Connected}" Value="false">
                                        <Setter Property="Source" Value="{StaticResource DisconnectedIcon}"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                </MenuItem.Header>
                <MenuItem x:Name="connectMenuItem" Header="{Binding ConnectOrDisconnect}" Click="MenuItem_Click"/>
            </MenuItem>
        </Menu>
        <Grid DockPanel.Dock="Bottom" Background="Black" />
    </DockPanel>
</Window>

MainWindow.xaml.cs:

using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            VM thisDC = (VM)this.DataContext;
            if (thisDC.Connected)
            {
                // DisConnect
                thisDC.Connected = false;
            }
            else
            {
                ConnectWindow cw = new ConnectWindow
                {
                    Owner = this,
                    DataContext = this.DataContext
                };
                cw.ShowDialog();
            }
        }
    }
}

ConnectWindow.xaml:

<Window x:Class="WpfApp1.ConnectWindow"
        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:autogrid="clr-namespace:WpfAutoGrid;assembly=WpfAutoGrid"
        mc:Ignorable="d" Title="ConnectWindow" Height="180" Width="270">
    <autogrid:AutoGrid            
                    Columns="Auto,Auto"
                    Rows="Auto,Auto, Auto, Auto"
                    Margin="20"
                    RowHeight="25">
        <autogrid:AutoGrid.Resources>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="Margin" Value="3" />
                <Setter Property="Width" Value="100" />
            </Style>
            <Style TargetType="{x:Type PasswordBox}">
                <Setter Property="Margin" Value="3" />
                <Setter Property="Width" Value="100" />
            </Style>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Margin" Value="3" />
                <Setter Property="Width" Value="100" />
            </Style>
        </autogrid:AutoGrid.Resources>
        <TextBlock Text="System: "/>
        <TextBox></TextBox>
        <TextBlock Text="User Name: "/>
        <TextBox></TextBox>
        <TextBlock Text="Password: "/>
        <PasswordBox></PasswordBox>
        <Button Grid.ColumnSpan="2" Content="Connect" Click="Button_Click" />
    </autogrid:AutoGrid>
</Window>

ConnectWindow.xaml.cs:

using System.Windows;

namespace WpfApp1
{
    public partial class ConnectWindow : Window
    {
        public ConnectWindow()
        {
            InitializeComponent();
        }

        private bool verified = true;

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (verified)
            {
                VM thisDC = (VM)this.DataContext;
                thisDC.Connected = true;
                this.Close();
            }
            else
            {
                // error message
                this.Close();
            }
        }
    }
}

VM.cs:

using System.ComponentModel;

namespace WpfApp1
{
    class VM : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private bool connected; 
        public bool Connected
        {
            get { return connected; }
            set
            {
                {
                    connected = value;
                    OnPropertyChanged("Connected");
                    if (value) { ConnectOrDisconnect = "Disconnect"; }
                    else { ConnectOrDisconnect = "Connect"; }
                }
            }
        }

        private string connectOrDisconnect;
        public string ConnectOrDisconnect
        {
            get { return connectOrDisconnect; }
            set
            {
                connectOrDisconnect = value;
                OnPropertyChanged("ConnectOrDisconnect");
            }
        }

        public VM()
        {
            Connected = false;
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

App.xaml:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="resources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

resources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <BitmapImage x:Key="ConnectedIcon" UriSource="pack://application:,,,/WpfApp1;component/ConnectedIcon.ico" />
    <BitmapImage x:Key="DisconnectedIcon" UriSource="pack://application:,,,/WpfApp1;component/DisconnectedIcon.ico" />
</ResourceDictionary>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...