modern-forms / modern.forms Goto Github PK
View Code? Open in Web Editor NEWCross-platform spiritual successor to Winforms for .NET 6+
License: MIT License
Cross-platform spiritual successor to Winforms for .NET 6+
License: MIT License
One of the core features of Winforms that made it so popular and easy to use was its drag and drop visual designer. Modern.Forms will need one to provide the same level of ease and convenience.
This is probably a far-future feature, as initial focus will be on ensuring Modern.Forms itself is stable and complete enough to be usable.
As ScrollableControl uses calculations based on scaled client sizes you get a weird behavior due to rounding issues:
If you base the calculations on the unscaled values it works fine (updated class is attached). Surely it can't be wrong to work only with unscaled values as there is no need to care about scaling inside this class at all.
ScrollableControl.zip
.
Hello, I'm very interested in this proj.
Below is some bugs or suggest for TextBox.
Please check it and merge.
Next time I will try to use pullRequest.
diff --git a/src/Modern.Forms/KeyPressEventArgs.cs b/src/Modern.Forms/KeyPressEventArgs.cs
index 5afe50d..56b88f6 100644
--- a/src/Modern.Forms/KeyPressEventArgs.cs
+++ b/src/Modern.Forms/KeyPressEventArgs.cs
@@ -32,17 +32,20 @@ namespace Modern.Forms
{
private readonly Keys key_data;
- public KeyPressEventArgs (char keyChar, Keys keyData = Keys.None)
+ public KeyPressEventArgs (char keyChar, string words, Keys keyData = Keys.None)
{
KeyChar = keyChar;
Handled = false;
key_data = keyData;
+ Words = words;
}
public bool Handled { get; set; }
public char KeyChar { get; set; }
+ public string Words { set; get; }
public bool Alt => key_data.HasFlag (Keys.Alt);
--- a/src/Modern.Forms/TextBox.cs
+++ b/src/Modern.Forms/TextBox.cs
@@ -212,7 +212,7 @@ namespace Modern.Forms
// Printable characters (except backspace)
if (e.KeyChar >= 32 && e.KeyChar != 127) {
- if (document.InsertText ((e.KeyChar).ToString ()))
+ if (document.InsertText (e.Words))
ScrollToCaret ();
}
}
--- a/src/Modern.Forms/Window.cs
+++ b/src/Modern.Forms/Window.cs
@@ -246,7 +246,7 @@ namespace Modern.Forms
break;
}
} else if (e is RawTextInputEventArgs te) {
- var kp_e = new KeyPressEventArgs (te.Text[0], KeyEventArgs.FromInputModifiers (te.Modifiers));
+ var kp_e = new KeyPressEventArgs (te.Text[0], te.Text, KeyEventArgs.FromInputModifiers (te.Modifiers));
adapter.RaiseKeyPress (kp_e);
e.Handled = true;
}
--- a/src/Modern.Forms/TextBoxDocument.cs
+++ b/src/Modern.Forms/TextBoxDocument.cs
@@ -92,8 +92,7 @@ namespace Modern.Forms
var current_caret = block.GetCaretInfo (cursor_index);
SetCursorToCharIndex (current_caret.PreviousCodePointIndex);
- RemoveText (cursor_index - 1, 1);
+ RemoveText (cursor_index, 1);
--- a/src/Modern.Forms/TextBox.cs
+++ b/src/Modern.Forms/TextBox.cs
@@ -367,6 +367,20 @@ namespace Modern.Forms
set => document.SelectionEnd = value;
}
+ public int FontSize {
+ set => document.FontSize = value;
+ get => document.FontSize;
+ }
+
+ public SkiaSharp.SKColor FontColor {
+ set => document.FontColor = value;
+ }
Sorry for code format, you have to write manually. Next time I will try to use PR.
Hi,
Do you plan to update WindowKit, considering System.Drawing.Common will drop non-Windows support in >7.0 releases (at least that is what I understood) ?
https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only
Considering you are already using Skia, replacement should be possible (?).
By the way, not relevant to my comment, I would like to congratulate you for building this cool library. SkiaSharp enables us to have unlimited creativity with custom controls, without any ancient GDI+ Windows nonsense.
I forked your code in attempt to create my own custom controls and add some theme improvements. Looks great!
Integration with other Skia controls (I made example for Microcharts) is simple and straightforward.
I am huge fan of dark themes so I made some changes in your Theme manager to support Light and Dark themes.
Considering datagrids are so important I was thinking to migrate ReoGrid (which can serve as gridview and excel clone) to Modern.Forms.
If/when I do it, I will share the code.
When using a managed TitleBar
, the title bar area is considered part of the client area, and thus a Control
placed at (0, 0)
ends up under the title bar. When using UseSystemDecorations = true
to get a system title bar, the area is not considered client area, and the control is completely visible. (The total Form
size is also different.)
Controls.Add (new Panel { Left = 20, Top = 20, Width = 100, Height = 100 }).Style.BackgroundColor = SKColors.Red;
Problem description:
Maybe changing :
Modern.Forms/src/Modern.Forms/FormTitleBar.cs
Lines 105 to 112 in 20a1f06
to :
protected override void OnMouseDown (MouseEventArgs e)
{
base.OnMouseDown (e);
// Reset any popup left open
FindForm ().adapter.SelectedControl?.Deselect ();
FindForm ().adapter.SelectedControl?.Select ();
// We won't get a MouseUp from the system for this, so don't capture the mouse
Capture = false;
FindForm ()?.BeginMoveDrag ();
}
This way parent control (that is FindForm ().adapter.SelectedControl) will automatically trigger popup close.
Tracks parity with System.Windows.Forms.Button (and ButtonBase).
Legend
[EditorBrowsable (false)]
I have a program which draws a bitmap in the center of a window.
using Modern.Forms;
using SkiaSharp;
namespace ModernFormsApp1
{
public partial class MainForm : Form
{
public MainForm()
{
Style.BackgroundColor = SKColors.Aquamarine;
var img = new SKBitmap(200, 200);
using (SKCanvas c = new SKCanvas(img))
{
c.Clear(SKColors.Black);
}
var pb = new PictureBox
{
Left = this.Size.Width / 2 - img.Width / 2,
Top = this.Size.Height / 2 - img.Height / 2,
Height = img.Height,
Width = img.Width,
Image = img
};
Controls.Add(pb);
}
}
}
On a monitor with a 100% DPI scaling I get this:
However with 125% scaling this is the result:
So it appears the image isn't scaled (stretched). Is this behavior expected?
We will need a DataGrid control.
Hi,
there is a bug related to Maximize/Minimize state.
In this case window will cover full screen (even when FullScreen option is disabled).
Steps to replicate:
As a quick fix I did simple bypass in 2 classes :
WinProc:
switch statement WindowsMessage.WM_SIZE:
`
var size = (SizeCommand)wParam;
if (_lastWindowState == WindowState.Minimized && (size == SizeCommand.Maximized))
{
var clientSize = new Size(ToInt32(lParam) & 0xffff, (ToInt32(lParam) >> 16));
Resize(clientSize, _resizeReason);
Resized(clientSize / RenderScaling, _resizeReason);
}
else if (Resized != null &&
(size == SizeCommand.Restored ||
size == SizeCommand.Maximized))
{
var clientSize = new Size(ToInt32(lParam) & 0xffff, ToInt32(lParam) >> 16);
Resized(clientSize / RenderScaling, _resizeReason);
}
var windowState = size switch
{
SizeCommand.Maximized => WindowState.Maximized,
SizeCommand.Minimized => WindowState.Minimized,
_ when _isFullScreenActive => WindowState.FullScreen,
_ => WindowState.Normal,
};
if (windowState != _lastWindowState)
{
_lastWindowState = windowState;
WindowStateChanged?.Invoke(windowState);
if (_isClientAreaExtended)
{
UpdateExtendMargins();
ExtendClientAreaToDecorationsChanged?.Invoke(true);
}
}
return IntPtr.Zero;`
WindowImpl (need to verify for Linux):
change Resize call by adding the following line of code at the top of the Resize method call:
if(WindowState == WindowState.Maximized) { MaximizeWithoutCoveringTaskbar(); }
Hopefully this will help someone who experienced similar issue.
Please note this is still not a final solution. There is another bug? related to regular maximize state. Application surface is maximized, but it's still not proper Maximized state (you can confirm that by bringing cursor close to the border, you will notice it can resize the surface).
form.KeyUp / KeyDown events are not available
Enhancement idea: enable MouseCapture handler (I will also try to look into it).
Reason: not possible to scroll when mouse outside of the form
Steps to reproduce: click on scroll bar -> drag down the scroll handle -> stops when mouse is outside of the form -> works ok when inside.
Reason: it becomes difficult to scroll on large app surfaces.
Hello, just see this sample controls.
It is pretty good for me (Winforms developer).
If the DataGrid control is on the way, I can port my winform app to osx.
Due to the current rounding behavior (for example Math.Round(2.50) is 2.0 and Math.Round(2.50 + 1.0) is 4.0) inside the Control.GetScaledBounds method you get unexpected results.
scale(left) + scale(width) is not automatically scale(left + width).
A solution would be to calculate the scaled/snapped X, Y, Right and Bottom first and base calculation for width/height on this values.
The following updated method works fine:
protected virtual Rectangle GetScaledBounds (Rectangle bounds, SizeF factor, BoundsSpecified specified)
{
var dx = factor.Width;
var dy = factor.Height;
int left = (int)Math.Round (bounds.X * factor.Width, MidpointRounding.ToZero);
int top = (int)Math.Round (bounds.Y * factor.Height, MidpointRounding.ToZero);
var sx = bounds.X;
var sy = bounds.Y;
var sw = bounds.Width;
var sh = bounds.Height;
// Scale the control location (unless this is the top level adapter)
if (FindAdapter () != this) {
if (specified.HasFlag (BoundsSpecified.X)) {
sx = left;
}
if (specified.HasFlag (BoundsSpecified.Y)) {
sy = top;
}
}
if (specified.HasFlag (BoundsSpecified.Width)) {
int right = (int)Math.Round ((bounds.Right) * factor.Width, MidpointRounding.ToZero);
sw = right - left;
}
if (specified.HasFlag (BoundsSpecified.Height)) {
int bottom = (int)Math.Round ((bounds.Bottom) * factor.Height, MidpointRounding.ToZero);
sh = bottom - top;
}
return new Rectangle (sx, sy, sw, sh);
}
When run on OSX, first it will show a terminal. How I can disable it and directly show the GUI?
So, I wish to:
Here is my code:
using Modern.Forms;
using System.Drawing;
namespace ModernFormsApp1
{
public partial class MainForm : Form
{
public MainForm()
{
this.Shown += async (_, _) =>
{
var ofd1 = new OpenFileDialog
{
Title = "Open this file 1"
};
await ofd1.ShowDialog(this);
await new DialogForm().ShowDialog(this);
};
}
}
public class DialogForm : Form
{
public DialogForm()
{
Text = "Dialog Form";
Size = new Size(500, 250);
var button3 = Controls.Add(new Button
{
Text = "DialogResult.Abort button",
Left = 10,
Top = 124,
Width = 250,
DialogResult = DialogResult.Abort
});
var button4 = Controls.Add(new Button
{
Text = "DialogResult.None button",
Left = 10,
Top = 164,
Width = 250,
DialogResult = DialogResult.None
});
}
}
}
When I run the code the OpenFileDialog is opened, but when I close it I get a blank dialog screen:
However when I change the order of dialogs (first opening the custom dialog and then the OpenFileDialog) it runs ok.
What am I doing wrong?
Hello, awesome work with this library, so far is the only one i found that allow for cross-platform gui development to work with .NET trimming, which is mandatory to get a smaller binary as possible, even better than the original winForm wich still to this day cannot be trimmed.
Anyway coming the the problem i found.
Using the options: Resizeable, AllowMaximize and AllowMinimize work only when UseSystemDecorations is set to false.
The native window of every OS allow to modify the size of the gui even if all of them are set to false.
I'm making an app with Modern forms and drawing a border on a panel with OnPaintBackground
.
public class Mypanel : Panel
{
public Mypanel(int width, int height)
{
Width = width;
Height = height;
}
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
e.Canvas.Clear(SKColors.Black);
// Outer wallpaper
var img = MapImages.PanelOuterWallpaper;
for (int row = 0; row <= Size.Height / img.Height; row++)
{
for (int col = 0; col <= Size.Width / img.Width; col++)
{
e.Canvas.DrawBitmap(img, new SKPoint(col * img.Width, row * img.Height));
}
}
// Paint panel borders
// Outer border
var paint1 = new SKPaint { Color = new SKColor(227, 227, 227) };
var paint2 = new SKPaint { Color = new SKColor(105, 105, 105) };
var paint3 = new SKPaint { Color = new SKColor(255, 255, 255) };
var paint4 = new SKPaint { Color = new SKColor(160, 160, 160) };
var paint5 = new SKPaint { Color = new SKColor(240, 240, 240) };
var paint6 = new SKPaint { Color = new SKColor(223, 223, 223) };
var paint7 = new SKPaint { Color = new SKColor(67, 67, 67) };
e.Canvas.DrawLine(new SKPoint(0, 0), new SKPoint(Size.Width - 2, 0), paint1);
e.Canvas.DrawLine(new SKPoint(0, 0), new SKPoint(0, Size.Height - 2), paint1);
e.Canvas.DrawLine(new SKPoint(Size.Width - 1, 0), new SKPoint(Size.Width - 1, Size.Height - 1), paint2);
e.Canvas.DrawLine(new SKPoint(0, Size.Height - 1), new SKPoint(Size.Width - 1, Size.Height - 1), paint2);
e.Canvas.DrawLine(new SKPoint(1, 1), new SKPoint(Size.Width - 3, 1), paint3);
e.Canvas.DrawLine(new SKPoint(1, 1), new SKPoint(1, Size.Height - 3), paint3);
e.Canvas.DrawLine(new SKPoint(Size.Width - 2, 1), new SKPoint(Size.Width - 2, Size.Height - 2), paint4);
e.Canvas.DrawLine(new SKPoint(1, Size.Height - 2), new SKPoint(Size.Width - 2, Size.Height - 2), paint4);
e.Canvas.DrawLine(new SKPoint(2, 2), new SKPoint(Size.Width - 4, 2), paint5);
e.Canvas.DrawLine(new SKPoint(2, 2), new SKPoint(2, Size.Height - 4), paint5);
e.Canvas.DrawLine(new SKPoint(Size.Width - 3, 2), new SKPoint(Size.Width - 3, Size.Height - 3), paint5);
e.Canvas.DrawLine(new SKPoint(2, Size.Height - 3), new SKPoint(Size.Width - 3, Size.Height - 3), paint5);
e.Canvas.DrawLine(new SKPoint(3, 3), new SKPoint(Size.Width - 5, 3), paint6);
e.Canvas.DrawLine(new SKPoint(3, 3), new SKPoint(3, Size.Height - 5), paint6);
e.Canvas.DrawLine(new SKPoint(Size.Width - 4, 3), new SKPoint(Size.Width - 4, Size.Height - 4), paint7);
e.Canvas.DrawLine(new SKPoint(3, Size.Height - 4), new SKPoint(Size.Width - 4, Size.Height - 4), paint7);
e.Canvas.DrawLine(new SKPoint(4, 4), new SKPoint(Size.Width - 6, 4), paint6);
e.Canvas.DrawLine(new SKPoint(4, 4), new SKPoint(4, Size.Height - 6), paint6);
e.Canvas.DrawLine(new SKPoint(Size.Width - 5, 4), new SKPoint(Size.Width - 5, Size.Height - 5), paint7);
// Inner border
e.Canvas.DrawLine(new SKPoint(9, 12 - 1), new SKPoint(9 + (Size.Width - 18 - 1), 12 - 1), paint7);
e.Canvas.DrawLine(new SKPoint(10, 12 - 1), new SKPoint(10, Size.Height - 12 - 1), paint7);
e.Canvas.DrawLine(new SKPoint(Size.Width - 11, 12 - 1), new SKPoint(Size.Width - 11, Size.Height - 12 - 1), paint6);
e.Canvas.DrawLine(new SKPoint(9, Size.Height - 12), new SKPoint(Size.Width - 9 - 1, Size.Height - 12), paint6);
e.Canvas.DrawLine(new SKPoint(10, 12 - 2), new SKPoint(9 + (Size.Width - 18 - 2), 12 - 2), paint7);
e.Canvas.DrawLine(new SKPoint(9, 12 - 2), new SKPoint(9, Size.Height - 12), paint7);
e.Canvas.DrawLine(new SKPoint(Size.Width - 10, 12 - 2), new SKPoint(Size.Width - 10, Size.Height - 12), paint6);
e.Canvas.DrawLine(new SKPoint(9, Size.Height - 12 + 1), new SKPoint(Size.Width - 9 - 1, Size.Height - 12+ 1), paint6);
}
When I run the program I get the following error in Program.cs:
However when I comment out a part of the e.Canvas.DrawLine
statements above, the program runs smoothly. Any clue what could be causing this?
Consider developing centralized controls that are essential for modern software development, including: WebView, PropertyGrid, Ribbon controls.
The following url is for reference:
https://github.com/VitalElement/CefGlue.Core/tree/master/CefGlue.Avalonia
https://github.com/amazerol/AvaloniaRibbon
https://github.com/bodong1987/Avalonia.PropertyGrid
I think that this way you are just fragmenting the ecosystem (e. g. WPF and Winforms interop just fine, I don't see why Modern.Forms shouldn't be able to interop in the same way with Avalonia). You are also missing the new features like embedded system support, hw accelerated rendering improvements and the upcoming text layout engine.
From my understanding, you just need an SkCanvas instance and input events. You can get an hardware-accelerate SKCanvas like this. If you absolutely need your rendering code to run on the UI thread, you can setup an UI-thread render timer.
Also, consider using the DrawingContext
provided by Avalonia itself, since it should be sufficient for any complex UI and allows for deferred rendering.
Although there is a basic Ribbon
control, it is considered "not ready for usage", and won't be receiving any love until other higher priority tasks are completed.
Current status:
Basic ribbon features are missing like:
Tracks parity with System.Windows.Forms.CheckBox (and ButtonBase).
Legend
[EditorBrowsable (false)]
Thanks.
When I run this proj in vs2019 for mac, I get an issue.
Anything, such as ribbon items, tabs, or even messagebox "ok" button or the close "x", is also cannot be clicked.
Could you please check it on Mac?
But I can only move this form.
And I find out maybe it's too slow to invalidate views...
Environment:
Windows 10 x64
Modern.Forms 0.2.0
Code:
using Modern.Forms;
static class Program
{
[System.STAThread]
static void Main()
{
var f = new Modern.Forms.Form();
f.Controls.Add(new CustomControl() { Width = 300, Height = 200 });
Application.Run(f);
}
}
class CustomControl : Control
{
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button != MouseButtons.None)
{
System.Diagnostics.Debugger.Break(); // never called
}
}
protected override void OnPaint(PaintEventArgs e)
{
e.Canvas.Clear(SkiaSharp.SKColors.Lime);
}
}
Tracks parity with System.Windows.Forms.Control.
Legend
Hello world!,
Nice, but still a lot work to do.
You probevly know but on listlike controls such as listbox, combo, treeview etc. there is no hoverOver indicator wich is a bit anoying.
Also there is no keyvoard Suport om such controls. which is IMO essencial.
Selction on textbox is broken or incomplete.
That having said, still promising
If i can help in any way let me know.
Regards,
Remco
Padding in Panel not working.
Source code from my app:
private Button button;
private Panel panelMenu;
private void InitializeComponent()
{
this.panelMenu = new Panel();
panelMenu.Name = "panelMenu";
panelMenu.Dock = DockStyle.Left;
panelMenu.Width = 260;
panelMenu.CurrentStyle.BackgroundColor = new SkiaSharp.SKColor(220, 220, 220);
panelMenu.Padding = new Padding(15,15,15,15);
panelMenu.CurrentStyle.Border.Radius = 15;
panelMenu.StyleHover.Border.Radius = 15;
button = new Button();
button.Text = "button";
button.Name = "button";
button.Dock = DockStyle.Top;
button.CurrentStyle.Border.Radius = 15;
button.StyleHover.Border.Radius = 15;
Text = "My Application";
this.TitleBar.Style.BackgroundColor = new SkiaSharp.SKColor(0,0,0);
this.panelMenu.Controls.Add(button);
this.Controls.Add(panelMenu);
}
Visual Studio Winforms style Editor and Drag and drop gallery planned?
This is not so much a question of my wants, but I am trying to convince the Developer of AdvancedHMI to port his code from Wibforms to something cross platform. His biggest hang up is no visual editing support with Avalonia.
The user base for the software is mostly non programmers.
This is a serious question, as .NET Core has gained native WinForms support now. Is there any reason for the continuation of this project?
Can you please investigate this one.
I compiled the latest changes but it looks like recent change related to Application.ClosePopups() might be causing some problems.
Control.RaiseMouseDown() will always trigger close of any popup if you click on a control within Popup window (try it with ComboBox, if you click on scrollbar notice popup automatically disappears).
Try to drag scrollbar...
gone.... :(
How about having Close placed into separate methods (CloseMenus() and ClosePopups()) ?
And then modify RaiseMouseDown (?)
Modern.Forms/src/Modern.Forms/Control.cs
Line 1401 in 504a7bf
internal void RaiseMouseDown(MouseEventArgs e)
{
var child = Controls.GetAllControls().LastOrDefault(c => c.Visible && c.GetControlBehavior(ControlBehaviors.ReceivesMouseEvents) && c.ScaledBounds.Contains(e.Location));
if (child != null)
child.RaiseMouseDown(TranslateMouseEvents(e, child));
else
{
// If we're clicking on the a Control that isn't the active menu,
// we need to close the active menu (if any)
if ((this as MenuBase)?.GetTopLevelMenu() != Application.ActiveMenu || Application.ActiveMenu is null)
Application.CloseMenus();
// If we're clicking on the a Control that isn't child of PopupWindow,
// we need to close the active popup (if any)
if (Application.ActivePopupWindow != null && this.FindWindow() is not PopupWindow)
Application.ClosePopups();
if (Enabled)
{
Select();
Capture = true;
OnMouseDown(e);
}
}
}
Please see if my suggestion makes sense.
Hi,
just a small improvement idea.
The line of code below should be within PopupWindow Show(), not within Control implementing PopupWindow.
Modern.Forms/src/Modern.Forms/ComboBox.cs
Line 83 in 504a7bf
(PopupWindow) What we have now:
Modern.Forms/src/Modern.Forms/PopupWindow.cs
Lines 41 to 56 in 504a7bf
(PopupWindow) We should change into:
Reason:
Not possible to (properly) use PopupWindow as a standalone control (ApplicApplication.ActivePopupWindow is internal).
PopupWindow should be responsible to change ActivePopupWindow reference, not the control implementing it.
The question is simple: there's any way to use the Windows Form Designer with Modern.Forms?
Thank you.
Hi,
just a small improvement idea.
The line of code below should be within PopupWindow Show(), not within Control implementing PopupWindow.
Modern.Forms/src/Modern.Forms/ComboBox.cs
Line 83 in 504a7bf
(PopupWindow) What we have now:
Modern.Forms/src/Modern.Forms/PopupWindow.cs
Lines 41 to 56 in 504a7bf
(PopupWindow) We should change into:
Reason:
Not possible to (properly) use PopupWindow as a standalone control (ApplicApplication.ActivePopupWindow is internal).
PopupWindow should be responsible to change ActivePopupWindow reference, not the control implementing it.
Hi,
changing object reference to TabPage collection is not working properly.
Maybe it would be good to remove this from ControlGallery example and suggest using only .Add() or Remove()/Insert() when changing tab pages ?
I was developing an app on linux. After some time I switched to windows and now when i use open file dialog, the whole app freezes.
This issue tracks our parity with the original Winforms.
Note that the goal is not to provide 100% parity, the goal is to provide a modern toolkit that is heavily inspired by Winforms. However there is definitely value in reviewing every Winforms API to determine which ones make sense to bring forward.
The following is running the ControlGallery sample app
Go to the buttons tab. Click on some buttons
then go to try and go to the treeview tab. CPU usage remains close to 100%.
Operating System: Debian GNU/Linux 11
KDE Plasma Version: 5.20.5
KDE Frameworks Version: 5.78.0
Qt Version: 5.15.2
Kernel Version: 5.10.0-9-amd64
OS Type: 64-bit
.Net 5.0.208
Although there is a basic ListView
control, it is considered "not ready for usage", and won't be receiving any love until other higher priority tasks are completed.
Current status:
Basic ListView features are missing like:
I could not find the following controls:
I added info for DataGrid / DataGridView to issue #15.
Here's a memory leak:
Modern.Forms/src/Modern.Forms/Control.cs
Line 53 in 51f917a
Controls do not currently support keyboard navigation.
Todo:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.