-
Jul 3rd, 2020, 10:45 AM
#1
Custom Window Forms dialog for VB.NET
The following GitHub repository shows how to use Windows-API-Code-Pack 1.1 as all code samples on the web are in C#. Also there are several tricks not easily learned within the code samples.
Code:
Imports System.IO
Imports DialogsVisualBasic.Classes
Imports Microsoft.WindowsAPICodePack.Dialogs
Namespace Modules
Public Module DialogHelpers
''' <summary>
''' Ask to close application with user defined buttons
''' </summary>
''' <param name="stayText">Text to show for not leaving</param>
''' <param name="leaveText">Text to show for leaving</param>
''' <returns></returns>
Public Function ExitApplication(stayText As String, leaveText As String) As TaskDialogResult
'
' Defines the default button
'
Dim stayButton = New TaskDialogButton("StayButton", stayText) With {.Default = True}
Dim closeButton = New TaskDialogButton("CancelButton", leaveText)
Dim dialog = New TaskDialog With {
.Caption = "Question",
.InstructionText = $"Close '{Application.ProductName}'",
.Icon = TaskDialogStandardIcon.Warning,
.Cancelable = True,
.OwnerWindowHandle = Form.ActiveForm.Handle,
.StartupLocation = TaskDialogStartupLocation.CenterOwner
}
'
' Place buttons in the order they should appear
'
dialog.Controls.Add(closeButton)
dialog.Controls.Add(stayButton)
'
' Issue that requires icon to be set here else
' it will not show.
'
AddHandler dialog.Opened,
Sub(sender As Object, ea As EventArgs)
Dim taskDialog = TryCast(sender, TaskDialog)
taskDialog.Icon = taskDialog.Icon
End Sub
'
' Set result for when dialog closes
'
AddHandler stayButton.Click,
Sub()
dialog.Close(TaskDialogResult.Cancel)
End Sub
AddHandler closeButton.Click,
Sub()
dialog.Close(TaskDialogResult.Close)
End Sub
'
' Display dialog
'
Return dialog.Show()
End Function
''' <summary>
''' Select server
''' </summary>
''' <returns></returns>
Public Function SelectWebServer() As String
Dim serverName As String = ""
Dim server1Button = New TaskDialogButton("Server1Button", "Server 1") With {.Default = True}
Dim server2Button = New TaskDialogButton("Server2Button", "Server 2")
Dim cancelButton = New TaskDialogButton("CancelButton", "Cancel")
Dim dialog = New TaskDialog With {
.Caption = "Question",
.InstructionText = $"Close '{Application.ProductName}'",
.Icon = TaskDialogStandardIcon.Warning,
.Cancelable = True,
.OwnerWindowHandle = Form.ActiveForm.Handle,
.StartupLocation = TaskDialogStartupLocation.CenterOwner
}
'
' Place buttons in the order they should appear
'
dialog.Controls.Add(server2Button)
dialog.Controls.Add(server1Button)
dialog.Controls.Add(cancelButton)
'
' Issue that requires icon to be set here else
' it will not show.
'
AddHandler dialog.Opened,
Sub(sender As Object, ea As EventArgs)
Dim taskDialog = TryCast(sender, TaskDialog)
taskDialog.Icon = taskDialog.Icon
End Sub
'
' Set result for when dialog closes
'
AddHandler server1Button.Click,
Sub()
serverName = "https://stackpath.bootstrapcdn.com"
dialog.Close(TaskDialogResult.Close)
End Sub
AddHandler server2Button.Click,
Sub()
serverName = "https://cdn.jsdelivr.net"
dialog.Close(TaskDialogResult.Close)
End Sub
AddHandler cancelButton.Click,
Sub()
serverName = ""
dialog.Close(TaskDialogResult.Close)
End Sub
dialog.Show()
Return serverName
End Function
Public Function DisplayInformationalText() As String
Dim result = ""
Dim detailsText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum"
Dim closeButton = New TaskDialogButton("CloseTaskDialogButton", "Not now") With {.Default = True}
Dim proceedButton = New TaskDialogButton("ProceedTaskDialogButton", "Get going")
Dim fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TextFile1.txt")
Dim dialog = New TaskDialog With {
.Caption = "Read file",
.DetailsCollapsedLabel = "More >>",
.DetailsExpanded = False,
.DetailsExpandedLabel = "<< Less",
.DetailsExpandedText = detailsText,
.ExpansionMode = TaskDialogExpandedDetailsLocation.Hide,
.InstructionText = $"Reading the file '{Path.GetFileName(fileName)}'",
.Icon = TaskDialogStandardIcon.Information,
.Cancelable = True,
.StartupLocation = TaskDialogStartupLocation.CenterOwner}
dialog.Controls.Add(closeButton)
dialog.Controls.Add(proceedButton)
dialog.OwnerWindowHandle = Form.ActiveForm.Handle
AddHandler dialog.Opened,
Sub(senderObject As Object, ea As EventArgs)
Dim taskDialog As TaskDialog = TryCast(senderObject, TaskDialog)
taskDialog.Icon = taskDialog.Icon
End Sub
AddHandler closeButton.Click,
Sub()
dialog.Close(TaskDialogResult.Cancel)
End Sub
AddHandler proceedButton.Click,
Sub()
dialog.Close(TaskDialogResult.Ok)
End Sub
If dialog.Show() = TaskDialogResult.Cancel Then
result = "Canceled"
Else
result = "Continue"
End If
Return result
End Function
Public Sub DisplayExceptionInformational(exceptionMessage As String)
Dim detailsText = "Something bad happened, please contact the service desk"
If exceptionMessage.Contains("The server was not found or was not accessible") Then
detailsText = "Please make sure there is a network connection and try again. If this fails contact the service desk"
End If
Dim closeButton = New TaskDialogButton("CloseTaskDialogButton", "Continue")
Dim dialog = New TaskDialog With {
.Caption = "Error",
.DetailsCollapsedLabel = "More >>",
.DetailsExpanded = False,
.DetailsExpandedLabel = "<< Less",
.DetailsExpandedText = detailsText,
.ExpansionMode = TaskDialogExpandedDetailsLocation.Hide,
.InstructionText = "Encountered a unrecoverable error!",
.Icon = TaskDialogStandardIcon.Information,
.Cancelable = True,
.StartupLocation = TaskDialogStartupLocation.CenterScreen}
dialog.Controls.Add(closeButton)
dialog.OwnerWindowHandle = Form.ActiveForm.Handle
AddHandler dialog.Opened,
Sub(senderObject As Object, ea As EventArgs)
Dim taskDialog = TryCast(senderObject, TaskDialog)
taskDialog.Icon = taskDialog.Icon
End Sub
AddHandler closeButton.Click,
Sub()
dialog.Close(TaskDialogResult.Cancel)
End Sub
dialog.Show()
End Sub
''' <summary>
''' Note here we have no X button
''' </summary>
Public Sub FeedbackDemo()
Dim closeButton = New TaskDialogButton("CloseTaskDialogButton", "Continue with no feedback") With {.Default = True}
Dim proceedButton = New TaskDialogButton("ProceedTaskDialogButton", "Submit feedback to support")
Dim dialog = New TaskDialog With {
.Caption = "Crashed",
.InstructionText = $"CRASH AND BURN{Environment.NewLine}The application performed an illegal action.",
.Icon = TaskDialogStandardIcon.Error,
.Cancelable = False,
.StartupLocation = TaskDialogStartupLocation.CenterOwner}
dialog.Controls.Add(closeButton)
dialog.Controls.Add(proceedButton)
dialog.OwnerWindowHandle = Form.ActiveForm.Handle
AddHandler dialog.Opened,
Sub(senderObject As Object, ea As EventArgs)
Dim taskDialog = TryCast(senderObject, TaskDialog)
taskDialog.Icon = taskDialog.Icon
End Sub
AddHandler closeButton.Click,
Sub()
dialog.Close(TaskDialogResult.Close)
End Sub
AddHandler proceedButton.Click,
Sub()
Diagnostics.CollectFeedBack()
dialog.Close(TaskDialogResult.Close)
End Sub
dialog.Show()
End Sub
Public Sub StupidThreeButtonsDemo()
Dim yesButton = New TaskDialogButton("YesTaskDialogButton", "YeeHaa!") With {.Default = True}
Dim neverButton = New TaskDialogButton("NeverTaskDialogButton", "No way!!!")
Dim dunnoButton = New TaskDialogButton("dunnoTaskDialogButton", "I donno?")
Dim dialog = New TaskDialog With {
.Caption = "Stupid",
.InstructionText = "You are about to do something stupid",
.Icon = TaskDialogStandardIcon.Shield,
.DetailsExpandedText = "Are you sure you want to continue with this really bad idea?",
.DetailsExpanded = True,
.Cancelable = False,
.StartupLocation = TaskDialogStartupLocation.CenterOwner}
dialog.FooterText = "I double dog dare you"
dialog.FooterIcon = TaskDialogStandardIcon.Information
dialog.Controls.Add(yesButton)
dialog.Controls.Add(neverButton)
dialog.Controls.Add(dunnoButton)
dialog.OwnerWindowHandle = Form.ActiveForm.Handle
AddHandler dialog.Opened,
Sub(senderObject As Object, ea As EventArgs)
Dim taskDialog = TryCast(senderObject, TaskDialog)
taskDialog.Icon = taskDialog.Icon
taskDialog.FooterIcon = taskDialog.FooterIcon
End Sub
AddHandler yesButton.Click,
Sub()
dialog.Close(TaskDialogResult.Close)
End Sub
AddHandler neverButton.Click,
Sub()
dialog.Close(TaskDialogResult.Close)
End Sub
AddHandler dunnoButton.Click,
Sub()
dialog.Close(TaskDialogResult.Close)
End Sub
dialog.Show()
End Sub
End Module
End Namespace
Usage
Code:
Imports DialogsVisualBasic.Classes
Imports DialogsVisualBasic.Modules
Imports Microsoft.WindowsAPICodePack.Dialogs
Public Class Form1
Private Sub MoreLessButton_Click(sender As Object, e As EventArgs) Handles MoreLessButton.Click
MoreLessLabel.Text = DisplayInformationalText()
End Sub
Private Sub QuestionButton_Click(sender As Object, e As EventArgs) Handles QuestionButton.Click
If ExitApplication("Stay", "Leave") = TaskDialogResult.Close Then
Close()
End If
End Sub
Private Sub ServerDialogButton_Click(sender As Object, e As EventArgs) Handles ServerDialogButton.Click
Dim serverName = SelectWebServer()
If Not String.IsNullOrWhiteSpace(serverName) Then
ServerNameTextBox.Text = serverName
Else
ServerNameTextBox.Text = "No server selected"
End If
End Sub
''' <summary>
'''
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks>
''' For the dialog to function properly see the dependency in the
''' manifest for this to work in an async method.
''' </remarks>
Private Async Sub ExceptionButton_Click(sender As Object, e As EventArgs) Handles ExceptionButton.Click
ExceptionButton.Enabled = False
Try
Dim table = Await DataOperations.ReadCustomers()
Catch ex As Exception
DisplayExceptionInformational(ex.Message)
Finally
ExceptionButton.Enabled = True
End Try
End Sub
Private Sub FeedbackButton_Click(sender As Object, e As EventArgs) Handles FeedbackButton.Click
FeedbackDemo()
End Sub
Private Sub StupidButton_Click(sender As Object, e As EventArgs) Handles StupidButton.Click
StupidThreeButtonsDemo()
End Sub
End Class
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|