2016-08-26 2 views
1

Как сослаться на пункт меню 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.

ответ

1

Я думаю, вы должны определить контракт на то, что пользователь может сделать, и так далее, а затем сопоставить элементы пользовательского интерфейса к некоторым Boolean:

кодекса

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> 

enter image description here

Так в основном вы меняете вещи, вместо того, чтобы ссылки на пункты меню, это будет либо запрос, имеет ли текущий пользователь это право и включить соответственно.

+0

Я ценю ваш ответ. Хотя это не решает (что я могу сделать работу) моей проблемой, так как мое меню находится в шаблоне глобального стиля, это заставило меня переосмыслить, как я делаю вещи, и необходимость, возможно, переместить меню из шаблона стиля и просто используйте главное окно для размещения любых «под» окон. Я должен был сделать свойство не прочитанным только для того, чтобы установить canedit в true, когда захочу, но в остальном я смог реализовать ваш код точно, как показано. На данный момент я не отмечаю, что это ответ на всю мою проблему, но я собираюсь проголосовать за этот ответ. –

Смежные вопросы