Wisej.NET v3.0

Released: May 10, 2022

Updates in v3.0

Features

Adds Support for .NET 6
Wisej.NET 3 is the first release of Wisej that supports both .NET Framework (4.8) and .NET Core (now .NET 6, will be 7...) and runs on Windows, Linux and MacOS.

Multi Targeting
New projects can target multiple .NET platforms. When you create a new Wisej 3 project, the wizard will allow you to select the target and enable certain options.

You can edit the .csproj or .vbproj at any time and change the <TargetFrameworks> tag. Just make sure that "net48" is always the first, if you want to use the designer.

Multitargeting will inevitably require the use of conditional compilation and excluding certain source code files from some platforms. The sources use conditional properties and partial classes to neatly separate code keeping the same class structure.

.NET 6+ Windows, Linux, MacOS
Now that Wisej applications can run on .NET 6+ they are standard ASP.NET Core applications. When running on .NET 4.8 they are standard ASP.NET applications.

ASP.NET Core applications don't use System.Web anymore and are not integrated with the IIS pipeline. They are all based on OWIN and Microsoft's Kestrel. Which means that they are almost always self-hosted web applications.

Download Callback
All the Application.Download, and Application.DownloadAndOpen methods have a new optional argument: a callback function, invoked when the file has been downloaded by the client.

This is a powerful new feature that allows an additional level of control that was not possible before.

Auto Layout
Wisej supports all sorts of very powerful layouts. However, all the layouts are implemented in layout engines and are "permanent": you have to set layout properties for the children and the container manages the layout using the specific layout engine.

If you just need to apply a specific layout, or a combination of layouts, by code, without having to change containers, use the Control.LayoutChildren() methods:

  • LayoutChildren(controls, dock, viewArea, spacing, useMargins, hAlign, vAlign)
  • LayoutChildren(controls, direction, viewArea, spacing, useMargins, hAlign, vAlign)

Each method is overloaded with multiple variants and most parameters are optional using predefined values.

Calling LayoutChildren without the controls collection and without the viewArea argument, arranges all the direct children using the control's DisplayRectangle as the bounding area.

Otherwise you can specify only a subset of the child controls and define a view area to limit the layout space. You can also try this new automatic layout functionality at design time using the new AutoLayout Panel.
You can call this method as many times as you need and with as many combinations of rules as you like. It doesn't change the layout engine or the layout options, it only moves and resizes the child controls according to the specified arguments.

Commanding
Wisej.NET introduced a new experimental feature to extend the current data binding model to make it compatible with MAUI's Commanding approach. In their implementation, commands work seamlessly with the existing data binding and have access to the full context of the command source. In MAUI the command's code is limited to a single parameter.

In this first implementation, Button and SplitButton have a new Command property and CommandChanged event. The Command property can be data-bound ICommand to properties of the data source.

When ICommand.CanExecute returns false, the command source button automatically disables itself. Clicking the button invokes the method attached to the command.

Use the new Command class or Command<T> class to wrap the implementation of a command and to cast the data item coming from the data source.

New Interfaces
Added new interfaces that allow code to use common features across controls:

  • ILabel. Implemented by all controls that have the Label property.
  • IImage. Implemented by all controls that have the various Image (ImageIndex, ImageKey, ImageSource) properties.
  • IReadOnly. Implemented by all controls that have the ReadOnly property.
  • IModified. Implemented by all controls that have the Modified property.

Using these interfaces eliminates the need to cast a control to the specific class.

DataGridView.DataRead
The Wisej.NET DataGridView control can handle an unlimited number of rows thanks to its built-in virtual scrolling and page caching on the client side. As the user scrolls the rows, the control manages a client-side cache of pages or rows and requests from the server only the pages that are needed to render the current view.

You can control the size of the client-side cache using the BlockSize and MaxCachedBlocks properties. When the DataGridView is in VirtualMode, it doesn't hold any data and can manage any number of rows with minimal memory usage. Your code provides the data as needed handling the CellValueNeeded and CellValuePushed events.

However, the VirtualMode events are fired every single time the application code uses a cell in the grid (in VirtualMode the grid doesn't hold any data). Usually, implementations of a virtual DataGridView must implement some kind of cache management on the server.

The new DataRead event makes this task a lot easier. It is fired when the client requests a page allowing an application to build and manage a small server-side cache in sync with the client scrolling, resulting in a much simpler usage of the VirtualMode events.

DataGridView.NoDataMessage
This property has been an experimental feature for a while and is now a supported property. It takes an HTML string and it displays filling the entire grid space when there grid contains no rows.

General Improvements

  • Rolled up all bug fixes.
  • Layout speed improvements on the client and server.
  • Refreshed all icons in designer and Theme Builder.