/ / Wie verweise ich dynamisch auf einen WPF-Menüpunkt in VB.net - wpf, vb.net, menuitem

Wie referenziere ich einen WPF-Menüeintrag dynamisch in VB.net - wpf, vb.net, Menüeintrag

Wie verweise ich dynamisch auf einen WPF-Menüpunkt in VB.net?

Ich habe ein Menü in meiner Anwendung.xaml in meiner Hauptfenstervorlage (siehe XAML-Code unten). In allen anderen Fenstern rufe ich diese Vorlage auf, indem ich den Stil des Fensters auf "(DynamicResource WindowTemplateMain}" setze. Ich möchte in der Lage sein, die Eigenschaft "isEnabled" jedes Menüelements basierend auf ihren Zugriffsrechten dynamisch festzulegen Ich kann alle Berechtigungen abrufen und sie problemlos durchlaufen. Mein Problem bei WPF ist, wie ich auf einen bestimmten Menüpunkt verweise, damit ich die Eigenschaft "isEnabled" ändern kann.

Nehmen wir zum Beispiel in meinem Menü unten an, ich möchteum den Menüpunkt "mnu_TimeEntry" zu deaktivieren. Wie verweise ich auf "mnu_TimeEntry", um die Eigenschaft "isEnabled" in "false" zu ändern? Ich brauche den VB-Code, der dies tun wird. Oder sollte ich das Hauptmenü ganz anders behandeln?

Vielen Dank im Voraus für Ihre Hilfe. Hier ist der gesamte relevante Code:

Application.xaml (wo ich das Menü erstelle):

    <!--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>

Beispiel Window.xaml (wo ich den Stil für die Fenstervorlage festgelegt habe und von wo aus ich im .vb-Code auf den Menüpunkt „mnu_TimeEntry“ verweisen möchte):

<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-Code, der offensichtlich nicht funktioniert, aber das Konzept zeigt, was ich tun möchte:

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" löst in diesem Fall einen Fehler aus, da er nicht deklariert ist. Ich kann es als Menü deklarieren, weiß aber immer noch nicht, wie ich es mit dem Aktionsmenüpunkt aus dem WPF-Menü verknüpfen soll.

Nochmals vielen Dank an alle, die diesem neuen WPF-Programmierer helfen können.

Antworten:

1 für die Antwort № 1

Ich denke, Sie sollten einen Vertrag für das definieren, was ein Benutzer tun kann, und dann Ihre UI-Elemente einigen zuordnen Boolean :

Code

Class MainWindow
Private Sub FrameworkElement_OnLoaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim workspace As New Workspace
workspace.User = New DefaultUser()
DataContext = workspace
End Sub
End Class

Public Class Workspace
Public Property User() As IUser

Public ReadOnly Property Text() As String
Get
Return "Hello, world !"
End Get
End Property

End Class

Public Interface IUser
ReadOnly Property CanEdit() As Boolean
End Interface

Public NotInheritable Class DefaultUser
Implements IUser

Public ReadOnly Property CanEdit As Boolean Implements IUser.CanEdit
Get
Return False
End Get
End Property

End Class

XAML

<Window x:Class="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:WpfApplication5"
mc:Ignorable="d" d:DataContext="{d:DesignInstance local:Workspace}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Menu >
<MenuItem DataContext="{Binding Path=User}" Header="_Edit" IsEnabled="{Binding CanEdit}" />
</Menu>

<TextBlock Grid.Row="1" Text="{Binding Text}" />
</Grid>
</Window>

Ergebnis

Bildbeschreibung hier eingeben

Wenn Sie also Dinge invertieren, anstatt auf Menüelemente zu verweisen, fragen diese entweder ab, ob der aktuelle Benutzer dieses Recht hat, und werden entsprechend aktiviert.