Сделать пункт меню главной формы доступным или недоступным - WPF

Ivan215

Как сделать пункт меню главной формы доступным или недоступным, то что в Windows Forms было просто:
Main.MenuItem.Enabled = False
и попутно вопрос - как например узнать высоту главного окна, как вообще обращаться к свойствам главной формы за пределами объявления класса (где работает Me)?Вот у меня есть например форма с именем Login
MsgBox("Login window height = " + Login.Height.ToString())
Это работает. А как быть с главной формой?
MsgBox("Main window height = " + MainWindow.Height.ToString())
Это НЕ РАБОТАЕТ.Подскажите, кто знает.32 просмотра и ни одного ответа! Видать сложный я вопрос задал - как из программного кода сделать пункт главного меню в главной форме доступным или недоступным?
5 ответов

Ivan215

Main.MenuItem.IsEnabled = False


Ivan215

Ivan215, Если хочешь узнать размер MainWindow из него же, попробуй так
MessageBox.Show("Main window height = " + Height.ToString())
Чтобы заблокировать MenuItem, можешь из Xaml заблокировать
<Menu Name="MenuTest" FontSize="20">
            <MenuItem Header="Test1"></MenuItem>
            <MenuItem IsEnabled="False" Header="Test2"></MenuItem>
            <MenuItem Header="Test1"></MenuItem>
        </Menu>
Или обратиться из кода, по индексу
 Dim menuitem As MenuItem = MenuTest.Items(2)
        menuitem.IsEnabled = False


Ivan215

Dim menuitem As MenuItem = MenuTest.Items(2)
У меня меню имеет имя "MainMenu"Пишу
Dim mitem As MenuItem = MainMenu.Items(1)
И сразу ошибка - MainMenu не обявлен.Имя главного класса у меня @MainWindow"Пишу
Dim mitem As MenuItem = MainWindow.MainMenu.Items(1)
Ошибка - Ссылка на член, не являющийся общим, должна быть ссылкой на объект.Оговариваюсь - ВСЕ СИЕ надо сделать в отдельной процедуре ЗА ПРЕДЕЛАМИ объявления класса MainWindow.То что в миниатюрах не подходит - поскольку надо запретить или разрешить часть пунктов главного меню не декларативно в XAML А В ЗАВИСИМОСТИ ОТ ТОГО КАКОЙ пользователь входит в программу - простой пользователь или администратор.Вот как просто и понятно это выглядело в Windows Forms:
    '=================================================================================================='
    '                                            PROCEDURE                                             '
    '                                    Enable/Disable Main Menu                                      '
    '=================================================================================================='
 
    Public Sub Mn_Menu(ByVal Pt_En As Boolean)
        Main.Reestr_MenuItem_L1.Enabled = Pt_En
        Main.Rep_MenuItem_L1.Enabled = Pt_En
        Main.Sprav_MenuItem_L1.Enabled = Pt_En
        Main.Test_MenuItem_L1.Enabled = Pt_En
 
        If gtp + gallow = "ADMINY" And Pt_En Then
            Main.Admin_MenuItem_L1.Enabled = True
        Else
            Main.Admin_MenuItem_L1.Enabled = False
        End If
    End Sub
Уже написал часть проекта под Windows Forns - там тоже была канитель с этой необозримой моделью объектов в .Net, но хотя бы выполнялись общие принципы ООП. А здесь видимо создатели решили сделать так, чтобы у всех мозги раком встали. Но такая замануха с визуализацией и решена сложная проблема адаптации интерфейса под разные разрешения мониторов. К тому же векторная графика вместо растровой.Вот такая строка не дает ошибки, но пункт меню почему-то по-прежнему доступен.
WpfApplication1.My.Windows.MainWindow.MainMenu.Items("Sprav_MenuItem_L1").IsEnabled = False
Этот оператор при выполнении дал ошибку
WpfApplication1.My.Windows.MainWindow.MainMenu.Items("Sprav_MenuItem_L1").IsEnabled = False
А вот этот не дает ошибки, но и результата тоже не дает - пункт меню по-прежнему доступен
WpfApplication1.My.Windows.MainWindow.MainMenu.Items(1).IsEnabled = False
WpfApplication1.My.Windows.MainWindow.MainMenu.Items(1).IsEnabled = Pt_En
Последняя строка сообщения - ошибка набора, не принимайте ее во внимание.


Ivan215

Пишу <div> <pre class="prettyprint linenums">Dim mitem As MenuItem = MainWindow.MainMenu.Items(1)</pre> </div>Ошибка - Ссылка на член, не являющийся общим, должна быть ссылкой на объект.
Ты берёшься за программу, не обладая элементарными понятиями в языке. В данном случае обращаться нужно к экземпляру класса MainWindow, используя ключевое слово Me


Ivan215

Ты берёшься за программу, не обладая элементарными понятиями в языке. В данном случае обращаться нужно к экземпляру класса MainWindow, используя ключевое слово Me
Уважаемый Модератор! Читайте внимательно обсуждаемую тему.
Оговариваюсь - ВСЕ СИЕ надо сделать в отдельной процедуре ЗА ПРЕДЕЛАМИ объявления класса MainWindow.
Вы в курсе, где можно обращаться к объекту по имени Me?