Code Monkey home page Code Monkey logo

modern.forms's People

Contributors

jpobst avatar lehonti avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

modern.forms's Issues

Visual Designer

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.

ScrollableControl issue

As ScrollableControl uses calculations based on scaled client sizes you get a weird behavior due to rounding issues:

image

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
.

3 issues and suggest about TextBox

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.

  1. TextBox do not support Multi-Chars input. This patch can support it.

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;
}

  1. TextBox:when delete words one by one, the last letter always follows and delete the last char get crash.

--- 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);

  1. Suggest Label/TextBox/etc add FontSize, FontColor to custom the single style for the specific control.
    Some change like this.

--- 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.

Memory Leak ?

Hi,

strange behavior when using 4K monitor with 200% scaling. Didn't test other resolutions.

Click on button, treelist, lables, menu ... all good. Memory in expected range (<100MB).
image

Click on Split Container ... memory goes to 1GB :/
image

System.Drawing.Common will be only supported on Windows

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.
image

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.

One more time, truly impressive work so far.
image

Managed TitleBar affects Control placement

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;

client-size

Popup Windows not closing on Form click/move.

Problem description:

  1. open combobox
    image
  2. We can move the form but combobox will stay open.
    image

Maybe changing :

protected override void OnMouseDown (MouseEventArgs e)
{
base.OnMouseDown (e);
// We won't get a MouseUp from the system for this, so don't capture the mouse
Capture = false;
FindForm ()?.BeginMoveDrag ();
}

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.

[Parity] Button

Tracks parity with System.Windows.Forms.Button (and ButtonBase).

Legend

  • Checked: Implemented (optional description pointing elsewhere if moved or renamed)
  • Unchecked: To be implemented
  • Strikethrough: Do not plan on implementing

Constuctors

  • Button ()

Properties

  • AutoEllipsis
  • AutoSize
  • AutoSizeMode
  • BackColor
    • Button.Style.BackgroundColor
  • CreateParams
    • Controls do not use native control params
  • DefaultImeMode
  • DefaultSize
  • DialogResult
  • FlatAppearance
    • Obsolete
  • FlatStyle
    • Obsolete
  • Image
  • ImageAlign
  • ImageIndex
  • ImageKey
  • ImageList
  • Text
    • No reason to override
  • TextAlign
  • TextImageRelation
  • UseCompatibleTextRendering
    • Obsolete
  • UseMnemonic
  • UseVisualStyleBackColor
    • Obsolete

Methods

  • CreateAccessibilityInstance ()
  • Dispose (Boolean)
  • GetPreferredSize (Size)
  • NotifyDefault (Boolean)
  • OnClick (EventArgs)
  • OnEnabledChanged (EventArgs)
    • No need to override
  • OnFontChanged (EventArgs)
    • No need to override
  • OnGotFocus (EventArgs)
    • No need to override
  • OnKeyDown (KeyEventArgs)
    • No need to override
  • OnKeyUp (KeyEventArgs)
  • OnLostFocus (EventArgs)
    • No need to override
  • OnMouseDown (MouseEventArgs)
    • No need to override
  • OnMouseEnter (EventArgs)
    • No need to override
  • OnMouseLeave (EventArgs)
    • No need to override
  • OnMouseMove (MouseEventArgs)
    • No need to override
  • OnMouseUp (MouseEventArgs)
    • No need to override
  • OnPaint (PaintEventArgs)
  • OnParentChanged (EventArgs)
    • No need to override
  • OnTextChanged (EventArgs)
    • No need to override
  • OnVisibleChanged (EventArgs)
    • No need to override
  • PerformClick ()
  • RescaleConstantsForDpi (Int32, Int32)
    • Shouldn't be needed
  • ResetFlagsandPaint ()
    • Shouldn't be needed
  • WndProc (Message&)
    • Controls do not use native OS messages
  • ToString ()

Events

  • AutoSizeChanged

Overridden just to set [EditorBrowsable (false)]

  • DoubleClick
  • MouseDoubleClick
  • ImeModeChanged
  • ImeMode

Issue with display scaling

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:
image

However with 125% scaling this is the result:
image

So it appears the image isn't scaled (stretched). Is this behavior expected?

Minimized/Maximized bug

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:

  • Open (any) application and set to Maximized state
  • Press Minimize
  • Click on taskbar to restore -> bug occurs which will set application to Full Screen instead of restoring it to previous Maximize state.

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).

[Enhancement] Mouse Capture

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.

image

[Question] Is DataGrid in process?

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.

Scaling/Rounding issue inside Control.GetScaledBounds

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.

image

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);
}

Opening a dialog after closing an OpenFileDialog

So, I wish to:

  1. Open an OpenFileDialog
  2. After closing the OpenFileDialog immediately open another custom dialog

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:
image

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?

Titlebar options dosen't work when 'UseSystemDecorations' is set to true

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.

Strange error

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:
image

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?

Why are you copy-pasting avalonia code instead of just referencing it?

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.

Ribbon control

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:

  • Ribbon can be created
  • Tabs can be created
  • Simple buttons can be created

Basic ribbon features are missing like:

  • Different button sizes
  • Different button types (dropdowns, toggles, etc)
  • Overflow
  • Keyboard navigation

[Parity] CheckBox

Tracks parity with System.Windows.Forms.CheckBox (and ButtonBase).

Legend

  • Checked: Implemented (optional description pointing elsewhere if moved or renamed)
  • Unchecked: To be implemented
  • Strikethrough: Do not plan on implementing

Constuctors

  • CheckBox ()

Properties

  • AutoEllipsis
  • AutoSize
  • Appearance
    • Low usefulness
  • AutoCheck
  • BackColor
    • Button.Style.BackgroundColor
  • CheckAlign
  • Checked
  • CheckState
  • CreateParams
    • Controls do not use native control params
  • DefaultImeMode
  • DefaultSize
  • FlatAppearance
    • Obsolete
  • FlatStyle
    • Obsolete
  • Image
  • ImageAlign
  • ImageIndex
  • ImageKey
  • ImageList
  • Text
    • No reason to override
  • TextAlign
  • TextImageRelation
  • ThreeState
  • UseCompatibleTextRendering
    • Obsolete
  • UseMnemonic
  • UseVisualStyleBackColor
    • Obsolete

Methods

  • CreateAccessibilityInstance ()
  • Dispose (Boolean)
  • GetPreferredSize (Size)
  • OnAppearanceChanged (EventArgs)
    • Low usefulness
  • OnCheckedChanged (EventArgs)
  • OnCheckStateChanged (EventArgs)
  • OnClick (EventArgs)
  • OnEnabledChanged (EventArgs)
    • No need to override
  • OnGotFocus (EventArgs)
    • No need to override
  • OnHandleCreated (EventArgs)
    • Controls do not use native OS handles
  • OnKeyDown (KeyEventArgs)
    • No need to override
  • OnKeyUp (KeyEventArgs)
  • OnLostFocus (EventArgs)
    • No need to override
  • OnMouseDown (MouseEventArgs)
    • No need to override
  • OnMouseEnter (EventArgs)
    • No need to override
  • OnMouseLeave (EventArgs)
    • No need to override
  • OnMouseMove (MouseEventArgs)
    • No need to override
  • OnMouseUp (MouseEventArgs)
    • No need to override
  • OnPaint (PaintEventArgs)
  • OnParentChanged (EventArgs)
    • No need to override
  • OnTextChanged (EventArgs)
    • No need to override
  • OnVisibleChanged (EventArgs)
    • No need to override
  • RescaleConstantsForDpi (Int32, Int32)
    • Shouldn't be needed
  • ResetFlagsandPaint ()
    • Shouldn't be needed
  • ToString ()
  • WndProc (Message&)
    • Controls do not use native OS messages

Events

  • AppearanceChanged
    • Low usefulness
  • AutoSizeChanged
  • CheckedChanged
  • CheckStateChanged

Overridden just to set [EditorBrowsable (false)]

  • DoubleClick
  • MouseDoubleClick
  • ImeModeChanged
  • ImeMode

Cannot click anything when run in vs2019 for mac

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...

MouseEventArgs.Button is always None in Control.OnMouseMove

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);
	}
}

[Parity] Control

Tracks parity with System.Windows.Forms.Control.

Legend

  • Checked: Implemented (optional description pointing elsewhere if moved or renamed)
  • Unchecked: To be implemented
  • Strikethrough: Do not plan on implementing

Constuctors

  • Control ()
  • Control (Control, String)
    • This feels unnecessary now that we have object initializers.
  • Control (Control, String, Int32, Int32, Int32, Int32)
    • This feels unnecessary now that we have object initializers.
  • Control (String)
    • This feels unnecessary now that we have object initializers.
  • Control (String, Int32, Int32, Int32, Int32)
    • This feels unnecessary now that we have object initializers.

Properties

  • AccessbilityObject
  • AccessibleDefaultActionDescription
  • AccessibleDescription
  • AccessibleName
  • AccessibleRole
  • AllowDrop
  • Anchor
  • AutoScrollOffset
  • AutoSize
  • BackColor
    • Control.Style.BackgroundColor
  • BackgroundImage
  • BackgroundImageLayout
  • BindingContext
  • Bottom
  • Bounds
  • CanEnableIme
  • CanFocus
  • CanRaiseEvents
    • Only used for ActiveX
  • CanSelect
  • Capture
  • CausesValidation
  • CheckForIllegalCrossThreadCalls
  • ClientRectangle
  • ClientSize
  • CompanyName
    • Unneeded
  • Container
    • Unneeded
  • ContainsFocus
  • ContextMenuStrip
    • Control.ContextMenu
  • Controls
  • Created
    • Unneeded
  • CreateParams
    • Unneeded
  • Cursor
  • DataBindings
  • DefaultBackColor
    • Control.Style.BackgroundColor
  • DefaultCursor
  • DefaultFont
    • Control.Style.Font
  • DefaultForeColor
    • Control.Style.ForegroundColor
  • DefaultImeMode
  • DefaultMargin
  • DefaultMaximumSize
  • DefaultMinimumSize
  • DefaultPadding
  • DefaultSize
  • DeviceDpi
  • DisplayRectangle
  • Disposing
  • Dock
  • DoubleBuffered
    • All controls are double buffered
  • Enabled
  • Focused
  • Font
    • Control.Style.Font
  • FontHeight
    • Control.Style.FontSize
  • ForeColor
    • Control.Style.ForegroundColor
  • Handle
    • Controls do not use native OS handles
  • HasChildren
  • Height
  • ImeMode
  • ImeModeBase
  • InvokeRequired
  • IsAccessible
  • IsDisposed
  • IsHandleCreated
    • Controls do not use native OS handles
  • IsMirrored
  • LayoutEngine
  • Left
  • Location
  • Margin
  • MaximumSize
  • MinimumSize
  • ModifierKeys
  • MouseButtons
  • MousePosition
  • Name
  • Padding
  • Parent
  • PreferredSize
  • ProductName
    • Unneeded
  • ProductVersion
    • Unneeded
  • PropagatingImeMode
  • RecreatingHandle
    • Controls do not use native OS handles
  • Region
    • Probably won't support irregularly shaped controls
  • RenderRightToLeft
    • Obsolete
  • ResizeRedraw
  • Right
  • RightToLeft
  • ScaleChildren
  • ShowFocusCues
  • ShowKeyboardCues
  • Site
    • Unneeded
  • Size
  • TabIndex
  • TabStop
  • Tag
  • Text
  • Top
  • TopLevelControl
    • Unneeded since we do not support parenting a form to a control
  • UseWaitCursor
  • Visible
  • Width
  • WindowTarget
    • Unneeded

Methods

  • AccessibilityNotifyClients (AccessibleEvents, Int32)
  • AccessibilityNotifyClients (AccessibleEvents, Int32, Int32)
  • BeginInvoke (Delegate)
  • BeginInvoke (Delegate, Object[])
  • BringToFront ()
  • Contains (Control)
  • CreateAccessibilityInstance ()
  • CreateControl ()
    • Controls do not use native OS handles
  • CreateControlsInstance ()
    • Handled automatically
  • CreateGraphics ()
  • CreateHandle ()
    • Controls do not use native OS handles
  • DefWndProc (Message&)
    • Controls do not use native OS messages
  • DestroyHandle ()
    • Controls do not use native OS handles
  • Dispose (Boolean)
  • DoDragDrop (Object, DragDropEffects)
  • DrawToBitmap (Bitmap, Rectangle)
  • EndInvoke (IAsyncResult)
  • FindForm ()
  • Focus ()
  • FromChildHandle (IntPtr)
    • Controls do not use native OS handles
  • FromHandle (IntPtr)
    • Controls do not use native OS handles
  • GetAccessibilityObjectById (Int32)
  • GetAutoSizeMode ()
  • GetChildAtPoint (Point, GetChildAtPointSkip)
  • GetChildAtPoint (Point)
  • GetContainerControl ()
  • GetNextControl (Control, Boolean)
  • GetPreferredSize (Size)
  • GetScaledBounds (Rectangle, SizeF, BoundsSpecified)
  • GetStyle (ControlStyles)
  • GetTopLevel ()
    • We don't support top level control (controls not in a form)
  • Hide ()
  • InitLayout ()
  • Invalidate (Region)
    • Probably won't support irregularly shaped controls
  • Invalidate (Region, Boolean)
    • Probably won't support irregularly shaped controls
  • Invalidate ()
  • Invalidate (Boolean)
  • Invalidate (Rectangle)
  • Invalidate (Rectangle, Boolean)
  • Invoke (Delegate)
  • Invoke (Delegate, Object[])
  • InvokeGotFocus (Control, EventArgs)
  • InvokeLostFocus (Control, EventArgs)
  • InvokeOnClick (Control, EventArgs)
  • InvokePaint (Control, PaintEventArgs)
  • InvokePaintBackground (Control, PaintEventArgs)
  • IsInputChar (Char)
  • IsInputKey (Keys)
  • IsKeyLocked (Keys)
  • IsMnemonic (Char, String)
  • LogicalToDeviceUnits (Int32)
  • LogicalToDeviceUnits (Size)
  • NotifyInvalidate (Rectangle)
  • OnAutoSizeChanged (EventArgs)
  • OnBackColorChanged (EventArgs)
  • OnBackgroundImageChanged (EventArgs)
  • OnBackgroundImageLayoutChanged (EventArgs)
  • OnBindingContextChanged (EventArgs)
  • OnCausesValidationChanged (EventArgs)
  • OnChangeUICues (UICuesEventArgs)
  • OnClick (EventArgs)
  • OnClientSizeChanged (EventArgs)
  • OnContextMenuStripChanged (EventArgs)
  • OnControlAdded (ControlEventArgs)
  • OnControlRemoved (ControlEventArgs)
  • OnCreateControl ()
    • Controls do not use native OS handles
  • OnCursorChanged (EventArgs)
  • OnDockChanged (EventArgs)
  • OnDoubleClick (EventArgs)
  • OnDpiChangedAfterParent (EventArgs)
  • OnDpiChangedBeforeParent (EventArgs)
  • OnDragDrop (DragEventArgs)
  • OnDragEnter (DragEventArgs)
  • OnDragLeave (EventArgs)
  • OnDragOver (DragEventArgs)
  • OnEnabledChanged (EventArgs)
  • OnEnter (EventArgs)
  • OnFontChanged (EventArgs)
  • OnForeColorChanged (EventArgs)
  • OnGiveFeedback (GiveFeedbackEventArgs)
  • OnGotFocus (EventArgs)
  • OnHandleCreated (EventArgs)
    • Controls do not use native OS handles
  • OnHandleDestroyed (EventArgs)
    • Controls do not use native OS handles
  • OnHelpRequested (HelpEventArgs)
  • OnImeModeChanged (EventArgs)
  • OnInvalidated (InvalidateEventArgs)
  • OnKeyDown (KeyEventArgs)
  • OnKeyPress (KeyPressEventArgs)
  • OnKeyUp (KeyEventArgs)
  • OnLayout (LayoutEventArgs)
  • OnLeave (EventArgs)
  • OnLocationChanged (EventArgs)
  • OnLostFocus (EventArgs)
  • OnMarginChanged (EventArgs)
  • OnMouseCaptureChanged (EventArgs)
  • OnMouseClick (MouseEventArgs)
    • Redundant with OnClick
  • OnMouseDoubleClick (MouseEventArgs)
    • Redundant with OnDoubleClick
  • OnMouseDown (MouseEventArgs)
  • OnMouseEnter (EventArgs)
  • OnMouseHover (EventArgs)
  • OnMouseLeave (EventArgs)
  • OnMouseMove (MouseEventArgs)
  • OnMouseUp (MouseEventArgs)
  • OnMouseWheel (MouseEventArgs)
  • OnMove (EventArgs)
  • OnNotifyMessage (Message)
    • Controls do not use native OS messages
  • OnPaddingChanged (EventArgs)
  • OnPaint (PaintEventArgs)
  • OnPaintBackground (PaintEventArgs)
  • OnParentBackColorChanged (EventArgs)
  • OnParentBackgroundImageChanged (EventArgs)
  • OnParentBindingContextChanged (EventArgs)
  • OnParentChanged (EventArgs)
  • OnParentCursorChanged (EventArgs)
  • OnParentEnabledChanged (EventArgs)
  • OnParentFontChanged (EventArgs)
  • OnParentForeColorChanged (EventArgs)
  • OnParentRightToLeftChanged (EventArgs)
  • OnParentVisibleChanged (EventArgs)
  • OnPreviewKeyDown (PreviewKeyDownEventArgs)
  • OnPrint (PaintEventArgs)
  • OnQueryContinueDrag (QueryContinueDragEventArgs)
  • OnRegionChanged (EventArgs)
    • Probably won't support irregularly shaped controls
  • OnResize (EventArgs)
  • OnRightToLeftChanged (EventArgs)
  • OnSizeChanged (EventArgs)
  • OnStyleChanged (EventArgs)
  • OnSystemColorsChanged (EventArgs)
  • OnTabIndexChanged (EventArgs)
  • OnTabStopChanged (EventArgs)
  • OnTextChanged (EventArgs)
  • OnValidated (EventArgs)
  • OnValidating (CancelEventArgs)
  • OnVisibleChanged (EventArgs)
  • PerformLayout ()
  • PerformLayout (Control, String)
  • PointToClient (Point)
  • PointToScreen (Point)
  • PreProcessControlMessage (Message&)
    • Controls do not use native OS messages
  • PreProcessMessage (Message&)
    • Controls do not use native OS messages
  • ProcessCmdKey (Message&, Keys)
  • ProcessDialogChar (Char)
  • ProcessDialogKey (Keys)
  • ProcessKeyEventArgs (Message&)
    • Controls do not use native OS messages
  • ProcessKeyMessage (Message&)
    • Controls do not use native OS messages
  • ProcessKeyPreview (Message&)
    • Controls do not use native OS messages
  • ProcessMnemonic (Char)
  • RaiseDragEvent (Object, DragEventArgs)
  • RaiseKeyEvent (Object, KeyEventArgs)
  • RaiseMouseEvent (Object, MouseEventArgs)
  • RaisePaintEvent (Object, PaintEventArgs)
  • RecreateHandle ()
    • Controls do not use native OS handles
  • RectangleToClient (Rectangle)
  • RectangleToScreen (Rectangle)
  • ReflectMessage (IntPtr, Message&)
    • Controls do not use native OS messages
  • Refresh ()
    • Probably won't support this
  • RescaleConstantsForDpi (Int32, Int32)
  • ResetBackColor ()
    • Used by designer
  • ResetBindings ()
    • Used by designer
  • ResetCursor ()
    • Used by designer
  • ResetFont ()
    • Used by designer
  • ResetForeColor ()
    • Used by designer
  • ResetImeMode ()
    • Used by designer
  • ResetMouseEventArgs ()
    • Used by designer
  • ResetRightToLeft ()
    • Used by designer
  • ResetText ()
    • Used by designer
  • ResumeLayout ()
  • ResumeLayout (Boolean)
  • RtlTranslateAlignment (HorizontalAlignment)
  • RtlTranslateAlignment (LeftRightAlignment)
  • RtlTranslateAlignment (ContentAlignment)
  • RtlTranslateContent (ContentAlignment)
  • RtlTranslateHorizontal (HorizontalAlignment)
  • RtlTranslateLeftRight (LeftRightAlignment)
  • Scale (Single)
  • Scale (Single, Single)
  • Scale (SizeF)
  • ScaleBitmapLogicalToDevice (Bitmap&)
  • ScaleControl (SizeF, BoundsSpecified)
  • ScaleCore (Single, Single)
  • Select ()
  • Select (Boolean, Boolean)
  • SelectNextControl (Control, Boolean, Boolean, Boolean, Boolean)
  • SendToBack ()
  • SetAutoSizeMode (AutoSizeMode)
  • SetBounds (Int32, Int32, Int32, Int32)
  • SetBounds (Int32, Int32, Int32, Int32, BoundsSpecified)
  • SetBoundsCore (Int32, Int32, Int32, Int32, BoundsSpecified)
  • SetClientSizeCore (Int32, Int32)
  • SetStyle (ControlStyles, Boolean)
  • SetTopLevel (Boolean)
    • We don't support top level controls
  • SetVisibleCore (Boolean)
  • Show ()
  • SizeFromClientSize (Size)
  • SuspendLayout ()
  • Update ()
  • UpdateBounds ()
  • UpdateBounds (Int32, Int32, Int32, Int32)
  • UpdateBounds (Int32, Int32, Int32, Int32, Int32, Int32)
  • UpdateStyles ()
  • UpdateZOrder ()
    • NA because controls do not have native OS handles
  • WndProc (Message&)
    • Controls do not use native OS messages

Events

  • AutoSizeChanged
  • BackColorChanged
  • BackgroundImageChanged
  • BackgroundImageLayoutChanged
  • BindingContextChanged
  • CausesValidationChanged
  • ChangeUICues
  • Click
  • ClientSizeChanged
  • ContextMenuStripChanged
  • ControlAdded
  • ControlRemoved
  • CursorChanged
  • DockChanged
  • DoubleClick
  • DpiChangedAfterParent
  • DpiChangedBeforeParent
  • DragDrop
  • DragEnter
  • DragLeave
  • DragOver
  • EnabledChanged
  • Enter
  • FontChanged
  • ForeColorChanged
  • GiveFeedback
  • GotFocus
  • HandleCreated
    • Controls do not use native OS handles
  • HandleDestroyed
    • Controls do not use native OS handles
  • HelpRequested
  • ImeModeChanged
  • Invalidated
  • KeyDown
  • KeyPress
  • KeyUp
  • Layout
  • Leave
  • LocationChanged
  • LostFocus
  • MarginChanged
  • MouseCaptureChanged
  • MouseClick
    • Redundant with Click
  • MouseDoubleClick
    • Redundant with DoubleClick
  • MouseDown
  • MouseEnter
  • MouseHover
  • MouseLeave
  • MouseMove
  • MouseUp
  • MouseWheel
  • Move
  • PaddingChanged
  • Paint
  • ParentChanged
  • PreviewKeyDown
  • QueryAccessibilityHelp
  • QueryContinueDrag
  • RegionChanged
  • Resize
  • RightToLeftChanged
  • SizeChanged
  • StyleChanged
  • SystemColorsChanged
  • TabIndexChanged
  • TabStopChanged
  • TextChanged
  • Validated
  • Validating
  • VisibleChanged

Good job

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

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);
        }

image

Visual Studio Winforms style Editor and Drag and drop gallery planned?

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.

Application.ClosePopups issue.

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...
image
gone.... :(
image

How about having Close placed into separate methods (CloseMenus() and ClosePopups()) ?
And then modify RaiseMouseDown (?)

internal void RaiseMouseDown (MouseEventArgs e)

This worked for me :

 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.

ActivePopupWindow reference update

Hi,

just a small improvement idea.

The line of code below should be within PopupWindow Show(), not within Control implementing PopupWindow.

Application.ActivePopupWindow = popup;

(PopupWindow) What we have now:

public void Show (int x, int y)
{
var point = parent_form.PointToClient (new Point (x, y));
var ppp = new PopupPositionerParameters {
AnchorRectangle = new WindowKit.Rect (point.X, point.Y, 1, 1),
Anchor = PopupAnchor.TopLeft,
Gravity = PopupGravity.BottomRight,
ConstraintAdjustment = PopupPositionerConstraintAdjustment.All,
Size = Size.ToAvaloniaSize ()
};
PopupImpl.PopupPositioner?.Update (ppp);
Show ();
}

(PopupWindow) We should change into:
image

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.

ActivePopupWindow reference update

Hi,

just a small improvement idea.

The line of code below should be within PopupWindow Show(), not within Control implementing PopupWindow.

Application.ActivePopupWindow = popup;

(PopupWindow) What we have now:

public void Show (int x, int y)
{
var point = parent_form.PointToClient (new Point (x, y));
var ppp = new PopupPositionerParameters {
AnchorRectangle = new WindowKit.Rect (point.X, point.Y, 1, 1),
Anchor = PopupAnchor.TopLeft,
Gravity = PopupGravity.BottomRight,
ConstraintAdjustment = PopupPositionerConstraintAdjustment.All,
Size = Size.ToAvaloniaSize ()
};
PopupImpl.PopupPositioner?.Update (ppp);
Show ();
}

(PopupWindow) We should change into:
image

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.

[Parity] System.Windows.Forms

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.

Links to issues tracking Control parity

CPU usage remains high

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%.

image

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

ListView control

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:

  • ListView can be created
  • Items can be created
  • Items can be selected

Basic ListView features are missing like:

  • Different views
  • Scrolling
  • Keyboard navigation

Missing Controls

I could not find the following controls:

  • GroupBox.
  • RichTextBox

I added info for DataGrid / DataGridView to issue #15.

Keyboard navigation

Controls do not currently support keyboard navigation.

Todo:

  • Button
  • CheckBox
  • ComboBox
  • Label
  • ListBox
  • ListView
  • Menu
  • MenuDropDown
  • Panel
  • PictureBox
  • ProgressBar
  • RadioButton
  • Ribbon
  • ScrollableControl
  • ScrollBar
  • SizeGrip
  • SplitContainer
  • Splitter
  • StatusBar
  • TabControl
  • TabStrip
  • TextBox
  • TitleBar
  • ToolBar
  • TreeView

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.