Как сослаться на пункт меню WPF динамически в VB.NETКак я ссылаться на пункт меню WPF динамически в VB.NET
У меня есть меню в моем Application.xaml внутри моего главного шаблона окна (см XAML код ниже). Во всех моих других окнах я вызываю этот шаблон, устанавливая стиль window = "(DynamicResource WindowTemplateMain}". Я хочу, чтобы иметь возможность динамически устанавливать свойство isEnabled каждого элемента меню на основе их привилегий доступа Я могу получить все привилегии и полностью переписать их. Моя проблема, будучи довольно новой для WPF, заключается в том, как я могу ссылаться на какой-либо данный пункт меню, чтобы изменить свойство «isEnabled»?
Например, в мое меню ниже, допустим, я хочу отключить пункт меню «mnu_TimeEntry». Как мне ссылаться на «mnu_TimeEntry», чтобы изменить свойство isEnabled на false? Мне нужен код vb, который будет делать это. управление основным меню совершенно по-другому?
заранее за вашу помощь Вот все, соответствующий код:.
Application.xaml (где я создаю меню):
<!--Global Window Template-->
<Style x:Key="WindowTemplateMain" TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="12" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<DockPanel Margin="0,0,-1.667,0.333" HorizontalAlignment="Stretch" Width="Auto">
<DockPanel.Background>
<LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
<GradientStop Color="{StaticResource mwb_WindowBackgroundGradient0}" Offset="0"/>
<GradientStop Color="{StaticResource mwb_WindowBackgroundGradient1}" Offset="1"/>
</LinearGradientBrush>
</DockPanel.Background>
<Menu x:Name="MWB_MainMenu" DockPanel.Dock="Top" IsMainMenu="True">
<MenuItem Header="_File">
<MenuItem Header="_Time Entry" Name="mnu_TimeEntry" Click="mnu_TimeEntryClick" />
<Separator />
<MenuItem Header="_Logout" Click="mnu_LogoutClick"/>
<Separator />
<MenuItem Header="_Exit" Click="mnu_ExitClick"/>
</MenuItem>
<MenuItem Header="_Reports">
<MenuItem Header="_Report1" />
<MenuItem Header="_Report2" />
<MenuItem Header="_Report3" />
</MenuItem>
<MenuItem Header="_Administration">
<MenuItem Header="_Clients" Click="mnu_ClientsClick" />
<MenuItem Header="Contac_ts" Click="mnu_ContactsClick" />
<MenuItem Header="System _Maintenance">
<MenuItem Header="User Access _Group Maintenance" Click="mnu_UserGroupMaintClick"/>
<MenuItem Header="System _Window Maintenance" Click="mnu_SysWinMaintClick"/>
</MenuItem>
</MenuItem>
<MenuItem Header="_Test Window" Click="mnu_TestWindow"/>
</Menu>
<Grid Margin="0,0,0,0" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="790*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="3*"/>
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="1" Grid.Column="0"/>
<TextBlock Style="{StaticResource mwb_Copyright}" Grid.Row="2" HorizontalAlignment="Stretch" Grid.ColumnSpan="2" Margin="5,0,4.666,4" />
</Grid>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Образец Window.xaml (где я установить стиль шаблона окна и из который в коде .vb я хочу сослаться на пункт меню «mnu_TimeEntry»):
<Window x:Name="MWB_TimeKeeper_Time_Entry" x:Class="MWB_TimeKeeper_Time_Entry"
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:MWB_TimeKeeper"
mc:Ignorable="d"
Title="MWB TimeKeeper - Time Entry"
Style="{DynamicResource WindowTemplateMain}" Width="800" Height="600">
.
.
.
</Window>
VB код, который, очевидно, не работает, но показывает концепцию того, что я хочу сделать:
Private Sub MWB_TimeKeeper_Time_Entry_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded, MyBase.Loaded
mnu_TimeEntry.IsEnabled = False
End Sub
"mnu_TimeEntry" в этом случае выдает ошибку, поскольку она не объявлена. Я могу объявить его как menuitem, но до сих пор не знаю, как связать его с пунктом меню действий из меню WPF.
Еще раз спасибо всем, кто может помочь этому новому программисту WPF.
Я ценю ваш ответ. Хотя это не решает (что я могу сделать работу) моей проблемой, так как мое меню находится в шаблоне глобального стиля, это заставило меня переосмыслить, как я делаю вещи, и необходимость, возможно, переместить меню из шаблона стиля и просто используйте главное окно для размещения любых «под» окон. Я должен был сделать свойство не прочитанным только для того, чтобы установить canedit в true, когда захочу, но в остальном я смог реализовать ваш код точно, как показано. На данный момент я не отмечаю, что это ответ на всю мою проблему, но я собираюсь проголосовать за этот ответ. –