Search code examples
c#.netvb.netuwptemplate10

Set shared property value to Me in constructor VB.NET


I try to create a VB.NET version of the Template10 UWP template.

The template is almost ready, but after execution I get an error message in Shell.xaml.vb file. The original C# code of this class:

public sealed partial class Shell : Page
{
    public static Shell Instance { get; set; }
    public static HamburgerMenu HamburgerMenu => Instance.MyHamburgerMenu;
    Services.SettingsServices.SettingsService _settings;

    public Shell()
    {
        Instance = this;
        InitializeComponent();
        _settings = Services.SettingsServices.SettingsService.Instance;
    }

    public Shell(INavigationService navigationService) : this()
    {
        SetNavigationService(navigationService);
    }

    public void SetNavigationService(INavigationService navigationService)
    {
        MyHamburgerMenu.NavigationService = navigationService;
        HamburgerMenu.RefreshStyles(_settings.AppTheme, true);
        HamburgerMenu.IsFullScreen = _settings.IsFullScreen;
        HamburgerMenu.HamburgerButtonVisibility = _settings.ShowHamburgerButton ? Visibility.Visible : Visibility.Collapsed;
    }
}

and the converted version in VB.NET:

Partial Public NotInheritable Class Shell
    Inherits Page

    Public Shared Property Instance As Shell
    Public Shared Property HamburgerMenu As HamburgerMenu = Instance.MyHamburgerMenu
    Public _settings As SampleApp.Services.SettingsServices.SettingsService

    Public Sub New()
        Instance = Me
        InitializeComponent()
        _settings = SampleApp.Services.SettingsServices.SettingsService.Instance
    End Sub

    Public Sub New(navigationService As INavigationService)
        Me.New()
        SetNavigationService(navigationService)
    End Sub

    Public Sub SetNavigationService(navigationService As INavigationService)
        MyHamburgerMenu.NavigationService = navigationService
        HamburgerMenu.RefreshStyles(_settings.AppTheme, True)
        HamburgerMenu.IsFullScreen = _settings.IsFullScreen
        HamburgerMenu.HamburgerButtonVisibility = If(_settings.ShowHamburgerButton, Visibility.Visible, Visibility.Collapsed)
    End Sub

End Class

The entry point of the execution is:

Public Sub New(navigationService As INavigationService)

and the exception occurs at this line:

 Instance = Me

The exception message:

An exception of type 'System.TypeInitializationException' occurred in SampleApp.exe but was not handled in user code

Additional information: The type initializer for 'SampleApp.Views.Shell' threw an exception.

InnerException: Object reference not set to an instance of an object.

How can I make this VB.NET class working? Thanks!


Solution

  • Your conversion of the 'HamburgerMenu' property is incorrect. Use:

    Public Shared ReadOnly Property HamburgerMenu() As HamburgerMenu
        Get
            Return Instance.MyHamburgerMenu
        End Get
    End Property
    

    The original C# uses an 'expression-bodied' member for 'HamburgerMenu' - this feature is not available in VB.