<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Majorsilence.Forms</title>
  <subtitle>.NET සඳහා විවෘත-මූලාශ්‍ර බහු-වේදිකා WinForms පුස්තකාලය — ඔබගේ යෙදුම් නැවත ලිවීමකින් තොරව Windows, macOS, Linux සහ බ්‍රවුසරය මත ධාවනය කරන Windows Forms ගැළපුම් ස්තරයකි.</subtitle>
  <id>https://forms.majorsilence.com/si/feed.xml</id>
  <link href="https://forms.majorsilence.com/si/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://forms.majorsilence.com/si/" rel="alternate" type="text/html"/>
  <updated>2026-10-08T14:30:00+00:00</updated>
  <author><name>Majorsilence</name></author>
  <rights>MIT</rights>
  <entry>
    <title>අගෝස්තුවේ සිට පැමිණි දේ: 26.9.0, නව backends හතරක්, CSS තේමා සහ හැසිරීම් විගණනය</title>
    <id>https://forms.majorsilence.com/si/blog/2026/10/08/whats-new-since-august-26-9-0/</id>
    <link href="https://forms.majorsilence.com/si/blog/2026/10/08/whats-new-since-august-26-9-0/" rel="alternate" type="text/html"/>
    <published>2026-10-08T14:30:00+00:00</published>
    <updated>2026-10-08T14:30:00+00:00</updated>
    <summary type="text">Majorsilence.Forms 26.9.0: GTK 4, Terminal, WinForms සහ WPF backends, net48 සහ netstandard2.0, CSS තේමා, MVVM, හැසිරීම් විගණනය, සහ උත්ශ්‍රේණි කිරීමේ සටහන්.</summary>
    <content type="html">&lt;p&gt;මෙහි අවසාන ලිපිය ලියා තිබුණේ 26.0.30 අනුවාදය අනුවය. 2026-08-17 සිට repository එකට commits 557 ක් එක් වී ඇති අතර වත්මන් නිකුතුව &lt;strong&gt;26.9.0&lt;/strong&gt; වේ. මෙය දැනට සිටින පරිශීලකයින් සහ ඇගයීම් කරන්නන් සඳහා සාරාංශයකි: වෙනස් වූයේ කුමක්ද, එක් එක් කොටස කෙතරම් පරිණතද, සහ උත්ශ්‍රේණි කිරීමේදී ඔබ අනිවාර්යයෙන්ම කළ යුතු එකම දෙය.&lt;/p&gt;&lt;h2 id=&quot;four-new-backends&quot;&gt;නව backends හතරක්&lt;/h2&gt;&lt;p&gt;ධාරක (hosts) තුනක් තිබුණි — Avalonia, Uno, Headless. දැන් හතක් ඇති අතර, සියල්ලම එකම පාලක කට්ටලය ධාවනය කරයි; වෙනස වන්නේ කවුළුව නිර්මාණය කර Skia surface එක ඉදිරිපත් කරන්නේ කවුද යන්න පමණි.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GTK 4&lt;/strong&gt; (&lt;code&gt;Majorsilence.Forms.Gtk4&lt;/code&gt;) යනු gir.core මත ගොඩනගා ඇති, Linux වලට මුල්තැන දෙන ධාරකයකි: එක් පෝරමයකට එක් සැබෑ &lt;code&gt;Gtk.Window&lt;/code&gt; එකක්, GLib main loop, තවද GTK 4 runtime සමඟ Windows සහ macOS මතද භාවිත කළ හැකිය. &lt;code&gt;Application.Run&lt;/code&gt; ට පෙර &lt;code&gt;Gtk4Application.Use ();&lt;/code&gt; සමඟ එය පැහැදිලිවම තෝරන්න. කාවැද්දීම (embedding) දෙපැත්තටම ක්‍රියා කරයි (&lt;code&gt;ToGtkWidget()&lt;/code&gt;, &lt;code&gt;ToGtkWindow()&lt;/code&gt;), GTK 4 එක් render tree එකක් සංයුක්ත කරන බැවින් &lt;code&gt;NativeControlHost&lt;/code&gt; හට “airspace” ගැටලුවක් නැත, තවද &lt;code&gt;WebBrowser&lt;/code&gt; WebKitGTK 6.0 මඟින් සහාය දක්වයි. Wayland මත තහවුරු කර ඇත. දන්නා හිඩැස්: තිර-පිහිටීම් පාලනයක් නැත (GTK 4 එම API එක ඉවත් කළේය), &lt;code&gt;SetIcon(byte[])&lt;/code&gt; යනු no-op (කිසිවක් නොකරයි) එකකි, native file pickers හිස්ව ආපසු එන බැවින් විකල්ප (fallback) සංවාද කවුළු භාවිත වේ, පූර්ණ සංඛ්‍යා scale factor පමණි, AOT-විශ්ලේෂණය කර නැත.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Terminal&lt;/strong&gt; (&lt;code&gt;Majorsilence.Forms.Terminal&lt;/code&gt;, 2026-10-04) පෝරමයක් console එකක් තුළ තනි-දර්ශන (single view) ලෙස ධාරණය කරයි — දුරකථනයක මෙන්, පෝරමය terminal එක පුරා පිරී යයි, title bar එකක් නැත. ලබා ගත හැකි තැන්වල එය සැබෑ pixel විභේදනයෙන් Kitty graphics හෝ Sixel භාවිත කරයි, එසේ නොමැති නම් Unicode block elements; හඳුනාගැනීම සිදු වන්නේ terminal එකෙන් විමසීමෙනි, තවද &lt;code&gt;MF_TERMINAL_GRAPHICS=halfblock|kitty|sixel&lt;/code&gt; මඟින් ප්‍රකාරයක් ස්ථිර කරයි. Mouse සහ keyboard ක්‍රියා කරයි; Ctrl+C සෑම විටම පිටවෙයි. &lt;code&gt;TerminalApplication.Use (options);&lt;/code&gt; සමඟ තෝරනු ලැබේ. xterm සහ WezTerm මත පමණක් තහවුරු කර ඇත. Native pickers, &lt;code&gt;NativeControlHost&lt;/code&gt; හෝ webview නැත.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WinForms&lt;/strong&gt; (&lt;code&gt;Majorsilence.Forms.WinForms&lt;/code&gt;) යනු Windows-පමණක් වූ &lt;em&gt;සංක්‍රමණ&lt;/em&gt; backend එකකි: Win32 pump මත සැබෑ &lt;code&gt;System.Windows.Forms&lt;/code&gt; කවුළු, GDI bitmap එකක් හරහා ඉදිරිපත් කරන Skia. එය පවතින්නේ ඔබට පවතින WinForms යෙදුමක් තුළ Majorsilence.Forms පාලක වරකට එක පාලකය බැගින් කාවැද්දීමට හැකි වන පරිදිය — &lt;code&gt;myMfControl.ToWinFormsControl()&lt;/code&gt;, &lt;code&gt;myForm.ToWinFormsForm()&lt;/code&gt;, &lt;code&gt;MajorsilenceFormsPresenter&lt;/code&gt; — ඉන්පසු සියල්ල port කළ පසු ධාරකය Avalonia හෝ Uno වෙත මාරු කරන්න. Gestures නැත, &lt;code&gt;IWebViewFactory&lt;/code&gt; නැත. එය Avalonia ධාරකය මත සම්පූර්ණ පෝරම සම්බන්ධ කරන පැරණි &lt;code&gt;WindowsFormsInterop&lt;/code&gt; ට වඩා වෙනස් ය.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WPF&lt;/strong&gt; (&lt;code&gt;Majorsilence.Forms.Wpf&lt;/code&gt;) WPF යෙදුම් සඳහා එම හැඩයම සහ අරමුණම ඇත: සැබෑ WPF &lt;code&gt;Window&lt;/code&gt; එකක්, &lt;code&gt;WriteableBitmap&lt;/code&gt; ඉදිරිපත් කිරීම, &lt;code&gt;ToWpfElement()&lt;/code&gt; සහ &lt;code&gt;ToWpfWindow()&lt;/code&gt;. &lt;code&gt;Platform.Backend = new Majorsilence.Forms.Wpf.WpfPlatformBackend ();&lt;/code&gt; සමඟ එය තෝරන්න.&lt;/p&gt;&lt;p&gt;Avalonia, WinForms සහ GTK 4 සැබෑ OS-මට්ටමේ modal සංවාද කවුළු ලබා දෙයි; Uno ස්වාධීන කවුළුවක් විවෘත කරයි, එබැවින් එහිදී &lt;code&gt;Form.ShowDialog(parent)&lt;/code&gt; භාවිත කරන්න.&lt;/p&gt;&lt;h2 id=&quot;net-framework-48-and-netstandard20&quot;&gt;.NET Framework 4.8 සහ netstandard2.0&lt;/h2&gt;&lt;p&gt;මූලික packages — &lt;code&gt;Majorsilence.Forms&lt;/code&gt;, &lt;code&gt;.Drawing.Common&lt;/code&gt;, &lt;code&gt;.Telerik&lt;/code&gt; — දැන් &lt;code&gt;net8.0&lt;/code&gt;, &lt;code&gt;net10.0&lt;/code&gt; &lt;strong&gt;සහ &lt;code&gt;netstandard2.0&lt;/code&gt;&lt;/strong&gt; බහු-ඉලක්ක (multi-target) කරන අතර, WinForms සහ WPF backends &lt;code&gt;net48&lt;/code&gt; එක් කරයි. එබැවින් .NET Framework 4.8 යෙදුමකට පළමුව නවීන .NET වෙත මාරු නොවී Majorsilence.Forms පාලක ධාරණය කළ හැකි අතර, එමඟින් බොහෝ සංක්‍රමණවලට තිබූ අනුපිළිවෙල පිළිබඳ ගැටලුවක් ඉවත් වේ.&lt;/p&gt;&lt;h2 id=&quot;the-behaviour-gap-audit&quot;&gt;හැසිරීම්-හිඩැස් විගණනය&lt;/h2&gt;&lt;p&gt;API-මතුපිට හිඩැස් සැලසුම් දෙක (WinForms සහ GDI+) &lt;strong&gt;ශුන්‍යයේ&lt;/strong&gt; පවතී: upstream හි ඇති සෑම member එකක්ම ප්‍රකාශ කර ඇත. එය සෑම විටම අඩු සිත්ගන්නා භාගය විය. පවතින නමුත් කිසිවෙකු කියවන්නේ නැති අගයක් ගබඩා කරන, හෝ කිසිවෙකු fire නොකරන event එකක් ඇති member එකක් ඔබේ සංක්‍රමණය කළ යෙදුම compile කරයි, ඉන්පසු නිහඬවම කිසිවක් නොකරයි.&lt;/p&gt;&lt;p&gt;එබැවින් 2026-08-25 දින ක්ෂේත්‍ර දොළහක විගණනයක් එක් එක් ක්ෂේත්‍රය upstream ක්‍රියාත්මක කිරීම සමඟ සංසන්දනය කර, හැසිරීම වෙනස් වූ &lt;strong&gt;සොයාගැනීම් 483 ක්&lt;/strong&gt; වාර්තා කළේය. එතැන් සිට අදියර 0–4 සහ බොහෝ පාලක-පවුල් පැමිණ ඇත. දැන් සැබෑ වී ඇති නිශ්චිත අයිතම: &lt;code&gt;ProcessCmdKey&lt;/code&gt; පූර්ව-සැකසුම් දාමය, තනි focus/validation පාලන ලක්ෂ්‍යයක්, client area එකෙන් පිටත title bar එක, &lt;code&gt;AutoScaleMode.Font&lt;/code&gt; සැබවින්ම පරිමාණනය කිරීම, සජීවී data binding (&lt;code&gt;CurrencyManager&lt;/code&gt;, &lt;code&gt;BindingNavigator&lt;/code&gt;), &lt;code&gt;ListView.View = Details&lt;/code&gt;, upstream අනුපිළිවෙලින් පෝරම ජීවන චක්‍රය (Load → VisibleChanged → Activated, Shown post කෙරේ), DataGridView තීරු නැවත පිළියෙල කිරීම, පෙළ පාලකවල Ctrl+Z, system tray හි &lt;code&gt;NotifyIcon&lt;/code&gt;, &lt;code&gt;Application.AddMessageFilter&lt;/code&gt;, සහ පෝරමයක් dispose කිරීමේදී එහි පාලක dispose කිරීම.&lt;/p&gt;&lt;p&gt;හිස් මතුපිට දැන් &lt;em&gt;මනිනු ලැබේ&lt;/em&gt;: baseline ගොනු මඟින් දන්නා no-op methods, අක්‍රිය events සහ ගබඩා-පමණක් properties ස්ථිර කරයි, එබැවින් ඒවාට එකතු කිරීම අහම්බයක් නොව සවිඥානික ක්‍රියාවකි. Stub ප්‍රතිපත්තිය වෙනස් නොවේ — no-op හෝ පෙරනිමි අගය ආපසු දීම, කිසිදා &lt;code&gt;NotImplementedException&lt;/code&gt; නොවේ.&lt;/p&gt;&lt;h2 id=&quot;logical-units-the-one-thing-you-must-do&quot;&gt;තාර්කික ඒකක: ඔබ අනිවාර්යයෙන්ම කළ යුතු එකම දෙය&lt;/h2&gt;&lt;p&gt;2026-10-01 දින &lt;code&gt;ClientRectangle&lt;/code&gt;, &lt;code&gt;ClientSize&lt;/code&gt; සහ paint canvas (&lt;code&gt;OnPaint&lt;/code&gt;, &lt;code&gt;Paint&lt;/code&gt;, &lt;code&gt;e.ClipRectangle&lt;/code&gt;, &lt;code&gt;e.Canvas&lt;/code&gt;) &lt;strong&gt;තාර්කික ඒකක (logical units)&lt;/strong&gt; බවට පත් විය; එය &lt;code&gt;Width&lt;/code&gt;/&lt;code&gt;Height&lt;/code&gt;/&lt;code&gt;Bounds&lt;/code&gt; සහ &lt;code&gt;MouseEventArgs&lt;/code&gt; සමඟ ගැළපේ. Framework එක ඔබ වෙනුවෙන් canvas එක display එකට පරිමාණනය කරයි.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;අභිරුචි පාලකයක් &lt;code&gt;e.Graphics.ScaleTransform (e.Scaling, e.Scaling)&lt;/code&gt; call කළේ නම්, එය ඉවත් කරන්න&lt;/strong&gt; — දැන් ඇඳීම දෙවරක් පරිමාණනය වේ. උපාංග පික්සල (device pixels) තවමත් &lt;code&gt;Scaled*&lt;/code&gt; පවුල (&lt;code&gt;ScaledWidth&lt;/code&gt;, &lt;code&gt;ScaledBounds&lt;/code&gt;, …), &lt;code&gt;PaintEventArgs.Scaling&lt;/code&gt; සහ &lt;code&gt;LogicalToDeviceUnits&lt;/code&gt; හරහා ලබා ගත හැකිය. එකම ව්‍යතිරේකය owner-draw events (&lt;code&gt;DrawItem&lt;/code&gt;, &lt;code&gt;DrawNode&lt;/code&gt;, &lt;code&gt;CellPainting&lt;/code&gt;) වන අතර, ඒවා තවමත් ඔබට උපාංග-පික්සල සීමා ලබා දෙයි. පැරණි හැසිරීම මත රඳා පවතින ඕනෑම දෙයක් අල්ලා ගැනීමට ඔබේ පරීක්ෂණ &lt;code&gt;MF_HEADLESS_SCALE=2&lt;/code&gt; සමඟ ධාවනය කරන්න.&lt;/p&gt;&lt;h2 id=&quot;browser-and-mobile&quot;&gt;Browser සහ mobile&lt;/h2&gt;&lt;p&gt;&lt;code&gt;net10.0-browser&lt;/code&gt;, &lt;code&gt;-android&lt;/code&gt; සහ &lt;code&gt;-ios&lt;/code&gt; මත Avalonia backend එක &lt;code&gt;CanRunModalLoop = false&lt;/code&gt; වාර්තා කරයි, තවද අවහිර කරන calls — &lt;code&gt;Form.ShowDialog&lt;/code&gt;, &lt;code&gt;MessageBox.Show&lt;/code&gt;, file pickers, &lt;code&gt;TaskDialog.ShowDialog&lt;/code&gt;, &lt;code&gt;VbInteraction.MsgBox&lt;/code&gt;/&lt;code&gt;InputBox&lt;/code&gt;, &lt;code&gt;RadMessageBox.Show&lt;/code&gt; — දැන් එල්ලී සිටිනවා වෙනුවට, කිසිවක් පෙන්වීමට &lt;em&gt;පෙර&lt;/em&gt; async සහෝදර method එක නම් කරමින් &lt;code&gt;PlatformNotSupportedException&lt;/code&gt; විසි කරයි. Async ආකාර (&lt;code&gt;ShowDialogAsync&lt;/code&gt;, &lt;code&gt;MessageBox.ShowAsync&lt;/code&gt;, &lt;code&gt;FileDialog.ShowDialogAsync&lt;/code&gt;, …) සෑම ධාරකයකම ක්‍රියා කරයි, එබැවින් සම්මත රටාව වන්නේ &lt;code&gt;await&lt;/code&gt; සහිත &lt;code&gt;async void&lt;/code&gt; handler එකකි. මූලික package එකේ ඇති Roslyn analyzer එකක් මේවා කලින්ම සොයා ගනී — &lt;code&gt;MFB001&lt;/code&gt; අවහිර කරන modal call, &lt;code&gt;MFB002&lt;/code&gt; Task එකක් මත සමමුහුර්ත රැඳී සිටීම, &lt;code&gt;MFB003&lt;/code&gt; &lt;code&gt;Thread.Sleep&lt;/code&gt;, එක් එක් සඳහා code fix එකක් සමඟ — browser TFMs සඳහා හෝ &lt;code&gt;.editorconfig&lt;/code&gt; හි &lt;code&gt;majorsilence_forms.browser_target = true&lt;/code&gt; සමඟ සක්‍රිය වේ.&lt;/p&gt;&lt;p&gt;Browser ඉලක්කය canvas එක අසලම &lt;strong&gt;ප්‍රවේශ්‍යතා DOM (accessibility DOM)&lt;/strong&gt; එකක් ද තබා ගනී: framework එකේම ස්වයංක්‍රීයකරණ ගසයෙන් (automation tree) ගොඩනගන, ARIA role, නම, තත්ත්වය සහ සීමා සහිත, එක් පාලකයකට එක් විනිවිද පෙනෙන, click-through element එකක්. තිර කියවන (screen readers), find-in-page සහ DOM-පාදක පරීක්ෂණ මෙවලම්වලට දැන් UI එක දැකිය හැකිය.&lt;/p&gt;&lt;p&gt;Android සහ iOS මත &lt;code&gt;TextBox&lt;/code&gt; focus වූ විට තිරයේ keyboard එක මතු වේ, &lt;code&gt;TextBoxBase.InputKind&lt;/code&gt; keyboard වර්ගය තෝරයි, safe-area insets &lt;code&gt;Form.SafeAreaPadding&lt;/code&gt; හරහා යෙදේ, සහ &lt;code&gt;WindowBase.BackRequested&lt;/code&gt; Android back බොත්තම හසුරුවයි. අවංක තත්ත්වය: Android හි මූලික සැබෑ-උපාංග පරීක්ෂාවක් සිදු කර ඇත (boot, taps, render scaling, touch scroll දෘඩාංග මත තහවුරු කර ඇත); keyboard, safe-area සහ භ්‍රමණය unit-test කර ඇත්තේ පමණි. iOS CI සැබෑ head එක compile කර simulator smoke check එකක දියත් කරයි, නමුත් කිසිවෙකු එය අන්තර්ක්‍රියාකාරීව ධාවනය කර නැති අතර job එක තවමත් &lt;code&gt;continue-on-error&lt;/code&gt; වේ.&lt;/p&gt;&lt;p&gt;දුරකථන-ශෛලියේ පිරිසැලසුම් පාලක ද ඒ සමඟම පැමිණියේය: &lt;code&gt;StackPanel&lt;/code&gt;, &lt;code&gt;Card&lt;/code&gt;, &lt;code&gt;RichListBox&lt;/code&gt; (බහු-පේළි සැකිලිගත පේළි) සහ &lt;code&gt;NavigationHost&lt;/code&gt; (back බොත්තමක් සහිත පිටු තොගයක්).&lt;/p&gt;&lt;h2 id=&quot;css-theming-and-theme-studio&quot;&gt;CSS තේමා සහ Theme Studio&lt;/h2&gt;&lt;p&gt;තේමා දැන් දැඩි, ලේඛනගත CSS උප කුලකයක් ලෙස ලිවිය හැකිය: &lt;code&gt;@theme &quot;Ocean&quot; extends Dark;&lt;/code&gt;, එක් &lt;code&gt;Theme&lt;/code&gt; property එකකට එක් &lt;code&gt;:root&lt;/code&gt; token එක බැගින්, &lt;code&gt;Button:hover { … }&lt;/code&gt; වැනි පාලක-වර්ග නීති, &lt;code&gt;Type::part&lt;/code&gt; හරහා කොටස්. Parser එක කිසිදා නිහඬව අසාර්ථක නොවේ — &lt;code&gt;ThemeStyleSheet.Parse&lt;/code&gt; diagnostics එකතු කරයි. &lt;code&gt;Theme.LoadFromCssFile&lt;/code&gt; සමඟ, හෝ &lt;code&gt;Theme.RegisterThemeCssFromFile&lt;/code&gt; + &lt;code&gt;Theme.ApplyTheme (&quot;Ocean&quot;)&lt;/code&gt; සමඟ පූරණය කරන්න; &lt;code&gt;Theme.ExportCss&lt;/code&gt; සමඟ අපනයනය කරන්න. Telerik compat ස්තරය ඇතුළුව සෑම පාලකයකටම selector එකක් ඇති අතර, පැරණි &lt;code&gt;&amp;lt;Theme&amp;gt;&lt;/code&gt; XML තවමත් ක්‍රියා කරයි.&lt;/p&gt;&lt;p&gt;සහායක packages දෙකක් &lt;em&gt;එකම&lt;/em&gt; sheet එක වෙනත් ධාරකවලට යොදයි: &lt;code&gt;Majorsilence.Forms.Theming.WinForms&lt;/code&gt; සැබෑ &lt;code&gt;System.Windows.Forms&lt;/code&gt; පාලක නැවත හැඩගන්වයි (Windows පමණි) සහ &lt;code&gt;Majorsilence.Forms.Theming.Avalonia&lt;/code&gt; native Avalonia Fluent පාලක නැවත හැඩගන්වයි, එබැවින් එක් CSS ගොනුවකට මිශ්‍ර සංක්‍රමණ යෙදුමකට තේමාවක් දිය හැකිය. &lt;code&gt;samples/ThemeStudio&lt;/code&gt; යනු පෙරදසුන සහ diagnostics සහිත සජීවී සංස්කාරකයකි; පෙර-ගොඩනගන ලද binaries GitHub Releases වෙත අමුණා ඇත.&lt;/p&gt;&lt;h2 id=&quot;mvvm-essentials-animation&quot;&gt;MVVM, Essentials, සජීවීකරණය&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Majorsilence.Forms.Mvvm&lt;/code&gt; යනු &lt;code&gt;INotifyPropertyChanged&lt;/code&gt; සහ &lt;code&gt;ICommand&lt;/code&gt; මත trim- සහ AOT-ආරක්ෂිත සම්බන්ධ කිරීමකි; reflection නැත, toolkit පරායත්තතාවයක් නැත: &lt;code&gt;viewModel.Observe (nameof (VM.Count), vm =&amp;gt; vm.Count, …)&lt;/code&gt;, ද්වි-මාර්ග &lt;code&gt;BindText&lt;/code&gt;/&lt;code&gt;BindChecked&lt;/code&gt;/&lt;code&gt;BindSelectedIndex&lt;/code&gt;/&lt;code&gt;BindValue&lt;/code&gt;, &lt;code&gt;BindCommand&lt;/code&gt;, සහ ඒ සියල්ල dispose කිරීමට &lt;code&gt;BindingScope&lt;/code&gt; එකක්. එය CommunityToolkit.Mvvm සමඟ එකට ක්‍රියා කරයි.&lt;/p&gt;&lt;p&gt;&lt;code&gt;Majorsilence.Forms.Essentials&lt;/code&gt; වේදිකාවට-විශේෂිත හැකියාවන් core එකෙන් පිටත තබා ගනී: &lt;code&gt;SecureStorage&lt;/code&gt;, &lt;code&gt;Speech&lt;/code&gt; text-to-speech, &lt;code&gt;Launcher.OpenAsync&lt;/code&gt; (http/https/mailto/tel/sms) සහ &lt;code&gt;FileSystem.OpenAppPackageFileAsync&lt;/code&gt;. සියල්ල no-op එකකට පහත් වේ; &lt;code&gt;IsSupported&lt;/code&gt; පරීක්ෂා කරන්න.&lt;/p&gt;&lt;p&gt;&lt;code&gt;control.RequestAnimationFrame&lt;/code&gt; සහ &lt;code&gt;Majorsilence.Forms.Animation&lt;/code&gt; (&lt;code&gt;Tween&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Easing&lt;/code&gt;, &lt;code&gt;Animator&lt;/code&gt;) Avalonia මත display-සමපාත සජීවීකරණයක් ද Headless මත අතින් පාලනය කරන ඔරලෝසුවක් ද ලබා දෙයි.&lt;/p&gt;&lt;h2 id=&quot;tooling&quot;&gt;මෙවලම්&lt;/h2&gt;&lt;ul&gt;  &lt;li&gt;MCP server එක ප්‍රකාශිත dotnet tool එකකි: &lt;code&gt;dotnet tool install -g Majorsilence.Forms.Mcp&lt;/code&gt;, ඉන්පසු &lt;code&gt;claude mcp add majorsilence-ui -- majorsilence-mcp --port 4444&lt;/code&gt;. එය ඔබේ යෙදුමේ &lt;code&gt;WebDriverServer&lt;/code&gt; සමඟ සන්නිවේදනය කරමින් &lt;code&gt;ui_snapshot&lt;/code&gt;, &lt;code&gt;ui_find&lt;/code&gt;, &lt;code&gt;ui_click&lt;/code&gt;, &lt;code&gt;ui_type&lt;/code&gt;, &lt;code&gt;ui_wait_for&lt;/code&gt; සහ &lt;code&gt;ui_screenshot&lt;/code&gt; නිරාවරණය කරයි.&lt;/li&gt;  &lt;li&gt;&lt;code&gt;samples/AutomationTarget&lt;/code&gt; යනු මෙවලම් ඉගෙනීම සඳහා හිතාමතාම අපහසු කළ කුඩා යෙදුමකි (clicks ප්‍රතික්ෂේප කරන පාලක, එකක් නම් නොකළ). අභිරුචි-ලෙස අඳින පාලක &lt;code&gt;IAutomationStateProvider&lt;/code&gt; හරහා අගය සහ තත්ත්වය ප්‍රකාශ කරයි.&lt;/li&gt;  &lt;li&gt;සංක්‍රමණ මෙවලම (migrator) දැන් dotnet tool එකක් ලෙස &lt;strong&gt;පමණක්&lt;/strong&gt; නිකුත් වේ (&lt;code&gt;dotnet tool install -g Majorsilence.Forms.Migrator&lt;/code&gt;); ස්වයං-අන්තර්ගත binaries තවදුරටත් නිකුතුවලට අමුණන්නේ නැත. නව switches: &lt;code&gt;--map&lt;/code&gt;, &lt;code&gt;--dual-build&lt;/code&gt;, &lt;code&gt;--strict&lt;/code&gt;, &lt;code&gt;--dry-run --diff&lt;/code&gt;.&lt;/li&gt;  &lt;li&gt;&lt;code&gt;Majorsilence.Forms.WinFormsShims.Compat&lt;/code&gt; යනු Majorsilence.Forms මඟින් සහාය දක්වන &lt;code&gt;System.Windows.Forms&lt;/code&gt; සහ &lt;code&gt;System.Drawing&lt;/code&gt; namespaces නිකුත් කරන සංකල්ප-සාධන (proof-of-concept) source generator එකකි, එබැවින් වෙනස් නොකළ WinForms මූලාශ්‍ර — &lt;code&gt;Designer.cs&lt;/code&gt; ඇතුළුව — compile වේ. පොදු API එක WinForms වෙත type කර ඇති පාලක පුස්තකාල සඳහා. PoC තත්ත්වය; &lt;code&gt;samples/WinFormsCompatDemo&lt;/code&gt; බලන්න.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;upgrade-notes&quot;&gt;උත්ශ්‍රේණි කිරීමේ සටහන්&lt;/h2&gt;&lt;ul&gt;  &lt;li&gt;&lt;strong&gt;26.9.0&lt;/strong&gt; ස්ථිර කරන්න. ව්‍යාපෘතිය තවමත් බීටා අවධියේ ඇති අතර තවමත් දෘශ්‍ය designer එකක් නැත.&lt;/li&gt;  &lt;li&gt;අභිරුචි paint කේතයේ ඇති ඕනෑම &lt;code&gt;ScaleTransform (e.Scaling, e.Scaling)&lt;/code&gt; ඉවත් කරන්න (ඉහත බලන්න).&lt;/li&gt;  &lt;li&gt;සැකිලි package id එක &lt;code&gt;Majorsilence.Forms.Templates&lt;/code&gt; වන අතර, &lt;code&gt;dotnet new install Majorsilence.Forms.Templates&lt;/code&gt; සමඟ ස්ථාපනය කෙරේ. &lt;code&gt;dotnet new majorsilenceforms&lt;/code&gt; දැන් බෙදාගත් UI පුස්තකාලයක් සහ desktop head එකක් සහිත solution එකක් සකසයි; &lt;code&gt;--IncludeAndroid&lt;/code&gt;, &lt;code&gt;--IncludeiOS&lt;/code&gt; සහ &lt;code&gt;--IncludeWasm&lt;/code&gt; heads එක් කරයි.&lt;/li&gt;  &lt;li&gt;බිඳ දමන වෙනස්කම් (breaking changes) &lt;code&gt;MIGRATION.md&lt;/code&gt; හි ලැයිස්තුගත කර ඇත: &lt;code&gt;SplitContainer.Orientation&lt;/code&gt;, &lt;code&gt;TreeViewDrawMode.OwnerDrawContent&lt;/code&gt;, event delegate types දැන් WinForms සමඟ ගැළපේ, සහ gradient/hatch brushes GDI+ සමඟ ගැළපෙන පරිදි මාරු කර ඇත.&lt;/li&gt;  &lt;li&gt;Browser, Android සහ iOS මත, අවහිර කරන සංවාද කවුළු calls ඒවායේ async සහෝදරයන් සමඟ ප්‍රතිස්ථාපනය කරන්න; ඒවා සොයා ගැනීමට &lt;code&gt;MFB001&lt;/code&gt;–&lt;code&gt;MFB003&lt;/code&gt; ට ඉඩ දෙන්න.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;where-to-read-more&quot;&gt;වැඩිදුර කියවීමට&lt;/h2&gt;&lt;ul&gt;  &lt;li&gt;&lt;a href=&quot;/si/backends/&quot;&gt;Platform backends&lt;/a&gt; සහ&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/backends.md&quot;&gt;&lt;code&gt;docs/backends.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href=&quot;/si/getting-started/&quot;&gt;Getting started&lt;/a&gt; සහ&lt;a href=&quot;/si/migration/&quot;&gt;සංක්‍රමණය (Migration)&lt;/a&gt; /&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/MIGRATION.md&quot;&gt;&lt;code&gt;MIGRATION.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/theming.md&quot;&gt;&lt;code&gt;docs/theming.md&lt;/code&gt;&lt;/a&gt;,&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/mvvm.md&quot;&gt;&lt;code&gt;docs/mvvm.md&lt;/code&gt;&lt;/a&gt;,&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/mobile-layout.md&quot;&gt;&lt;code&gt;docs/mobile-layout.md&lt;/code&gt;&lt;/a&gt;,&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/animation.md&quot;&gt;&lt;code&gt;docs/animation.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/behaviour-gap-plan.md&quot;&gt;&lt;code&gt;docs/behaviour-gap-plan.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href=&quot;/si/automation/&quot;&gt;ස්වයංක්‍රීයකරණය (Automation)&lt;/a&gt; සහ&lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/docs/automation.md&quot;&gt;&lt;code&gt;docs/automation.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href=&quot;/si/samples/&quot;&gt;නිදසුන් (Samples)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content>
    <author><name>Majorsilence</name></author>
  </entry>
  <entry>
    <title>Majorsilence.Forms හඳුන්වා දීම</title>
    <id>https://forms.majorsilence.com/si/blog/2026/07/21/introducing-majorsilence-forms/</id>
    <link href="https://forms.majorsilence.com/si/blog/2026/07/21/introducing-majorsilence-forms/" rel="alternate" type="text/html"/>
    <published>2026-07-21T15:00:00+00:00</published>
    <updated>2026-07-21T15:00:00+00:00</updated>
    <summary type="text">Majorsilence.Forms හඳුන්වා දීම: .NET සඳහා විවෘත-මූලාශ්‍ර බහු-වේදිකා WinForms පුස්තකාලයක්. ඔබේ පෝරම, පාලක සහ Designer ගොනු එලෙසම තබාගෙන, එකම යෙදුම නැවත ලිවීමකින් තොරව Windows, macOS සහ Linux මත ධාවනය කරන්න.</summary>
    <content type="html">&lt;p&gt;WinForms යෙදුමක් Windows-පමණක් desktop එකෙන් ඉවතට ගෙන යාම යනු සාම්ප්‍රදායිකව මුල සිටම නැවත ලිවීමකි (rewrite): XAML, බලහත්කාරයෙන් MVVM ව්‍යුහයකට වෙනස් කිරීම, නැතහොත් web. එය මිල අධිකයි, අවදානම් සහිතයි, තවද බොහෝ විට අලුත් පෙනුමක් පමණක් අවශ්‍ය codebase එකක් වෙනුවෙන් වසර ගණනාවක් තිස්සේ ක්‍රියා කළ ව්‍යාපාරික තර්කනය (business logic) සහ UX ඉවත දමයි.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Majorsilence.Forms&lt;/strong&gt; වෙනස් ප්‍රවේශයක් ගනී: එය WinForms API මතුපිට පිළිබිඹු කරයි — &lt;code&gt;Form&lt;/code&gt;, පාලක (controls), සිදුවීම් හසුරුවන (event handlers), &lt;code&gt;*.Designer.cs&lt;/code&gt; code-behind පවා — තවද පවතින පෝරම සහ පාලක ඉතා අඩු වෙනස්කම් ප්‍රමාණයකින් ගෙන යා හැකි වන පරිදි ගැළපුම් ස්තරයක් (compatibility layer) සපයයි. ක්‍රමලේඛන ආකෘතිය වෙනස් නොවේ; වෙනස් වන්නේ එය ධාවනය වන ස්ථානය පමණි.&lt;/p&gt;&lt;h2 id=&quot;how-its-built&quot;&gt;එය ගොඩනගා ඇති ආකාරය&lt;/h2&gt;&lt;p&gt;සෑම පාලකයක්ම &lt;a href=&quot;https://github.com/mono/SkiaSharp&quot;&gt;SkiaSharp&lt;/a&gt; භාවිතයෙන් &lt;code&gt;SKSurface&lt;/code&gt; එකකට ඇඳ ඇත්තේ, මාරු කළ හැකි ධාරක (host) backend එකක් මතය:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;strong&gt;Avalonia&lt;/strong&gt; (පෙරනිමි) — Windows, macOS, Linux desktop කිසිදු සැකසීමකින් තොරව, තවද mobile සහ web වෙත ද මාර්ගයක් ලෙස එයටම ආවේණික Android, iOS සහ Browser (WebAssembly) ඉලක්ක සමඟ.&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Uno Platform&lt;/strong&gt; — පුළුල්ම ආවරණය: desktop, iOS, Android සහ WebAssembly.&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Headless&lt;/strong&gt; — CI සහ ස්වයංක්‍රීය පරීක්ෂණ සඳහා කිසිදු පරායත්තතාවයකින් තොර, තිරයෙන් පිටත (offscreen) විදැහුම්කරණය.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;මූලික &lt;code&gt;Majorsilence.Forms&lt;/code&gt; assembly එක කිසිදු windowing toolkit එකක් reference නොකරයි — SkiaSharp පමණි. Backends යනු &lt;code&gt;IPlatformBackend&lt;/code&gt; සහ &lt;code&gt;IWindowBackend&lt;/code&gt; යන කුඩා interfaces දෙකට සම්බන්ධ වන වෙනම assemblies ය. එම සන්ධිය (seam) නිසා, යෙදුම් කේතයේ කිසිදු වෙනසක් නොමැතිව හරියටම එකම යෙදුමට අද Avalonia ද හෙට Uno ද ඉලක්ක කළ හැකිය. වැඩිදුර &lt;a href=&quot;/si/backends/&quot;&gt;Platform backends&lt;/a&gt; හි කියවන්න.&lt;/p&gt;&lt;h2 id=&quot;who-its-for&quot;&gt;එය කා සඳහාද&lt;/h2&gt;&lt;p&gt;ඔබ අද Windows-පමණක් ධාවනය වන WinForms codebase එකක් සතුව සිටිමින්, වසර ගණනාවක නැවත ලිවීමක් ආරම්භ කරනවා වෙනුවට ගම්‍යතාවය රඳවා ගැනීමට — ඔබේ පාලක, ඔබේ කණ්ඩායමේ හුරුපුරුදු දැනුම, ඔබේ ව්‍යාපාරික තර්කනය නැවත භාවිත කිරීමට — කැමති නම්, මෙය ඔබ සඳහාම ගොඩනගා ඇත.&lt;/p&gt;&lt;p&gt;මෙම ව්‍යාපෘතිය මුල් අවධියක පවතී: API ස්ථාවර වෙමින් පවතින අතර සෑම WinForms කොටසක්ම තවමත් ආවරණය වී නැත. නව බහු-වේදිකා ව්‍යාපාරික (LOB) යෙදුම් සඳහා එය දැනටමත් හොඳ තේරීමකි, තවද ඔබ අනුවාදය ස්ථිර කරන්නේ නම් (pin your version) සැබෑ production යෙදුම් සංක්‍රමණය කිරීමටද සුදුසුය. අද ක්‍රියාත්මක කර ඇත්තේ මොනවාද, stub ලෙස පමණක් ඇත්තේ මොනවාද යන්න හරියටම දැනගැනීමට &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/COMPATIBILITY_MATRIX.md&quot;&gt;ගැළපුම් න්‍යාසය (compatibility matrix)&lt;/a&gt; බලන්න.&lt;/p&gt;&lt;h2 id=&quot;try-it&quot;&gt;උත්සාහ කර බලන්න&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;dotnet new --install MajorsilenceForms.Templatesdotnet new majorsilenceformsdotnet run&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;නැතහොත් සැබෑ යෙදුමක් ගවේෂණය කරන්න — &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/tree/main/samples/Explorer&quot;&gt;&lt;code&gt;samples/Explorer&lt;/code&gt;&lt;/a&gt; යනු සම්පූර්ණ Windows Explorer ප්‍රතිනිර්මාණයක් වන අතර, &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/tree/main/samples/Outlaw&quot;&gt;&lt;code&gt;samples/Outlaw&lt;/code&gt;&lt;/a&gt; යනු Outlook ප්‍රතිනිර්මාණයකි; දෙකම එකම පාලක කට්ටලය මත වේදිකා හරහා කිසිදු වෙනසකින් තොරව ධාවනය වේ.&lt;/p&gt;&lt;p&gt;ඔබේ පළමු යෙදුම සකස් කිරීමට &lt;a href=&quot;/si/getting-started/&quot;&gt;Getting Started&lt;/a&gt; බලන්න.&lt;/p&gt;</content>
    <author><name>Majorsilence</name></author>
  </entry>
  <entry>
    <title>Platform backends: Avalonia, Uno සහ Headless</title>
    <id>https://forms.majorsilence.com/si/blog/2026/07/21/platform-backends-avalonia-uno-headless/</id>
    <link href="https://forms.majorsilence.com/si/blog/2026/07/21/platform-backends-avalonia-uno-headless/" rel="alternate" type="text/html"/>
    <published>2026-07-21T11:00:00+00:00</published>
    <updated>2026-07-21T11:00:00+00:00</updated>
    <summary type="text">බහු-වේදිකා WinForms, Avalonia, Uno Platform සහ headless Skia surface එකක් මත ධාවනය වන ආකාරය: සෑම පාලකයක්ම SkiaSharp සමඟ අඳින අතර යටින් ඇති windowing toolkit එක මාරු කළ හැකි ධාරකයක් පමණි.</summary>
    <content type="html">&lt;p&gt;Majorsilence.Forms &lt;strong&gt;තමන්ගේම සියලු ඇඳීම්&lt;/strong&gt; SkiaSharp සමඟ සිදු කරයි. සෑම පාලකයක්ම &lt;code&gt;SKSurface&lt;/code&gt;/&lt;code&gt;SKCanvas&lt;/code&gt; එකකට අඳියි; යටින් ඇති windowing toolkit එක &lt;em&gt;ධාරකයක් (host)&lt;/em&gt; පමණි — එය native කවුළු නිර්මාණය කරයි, message loop එක ධාවනය කරයි, ආදානය (input) ලබා දෙයි, සහ Skia surface එක තිරයට ඉදිරිපත් කරයි. එම වෙන්කිරීම නිසා අද හරියටම එකම පාලක කට්ටලයට එකිනෙකට බෙහෙවින් වෙනස් toolkits තුනක් මත ධාවනය විය හැකිය.&lt;/p&gt;&lt;h2 id=&quot;the-seam&quot;&gt;සන්ධිය (seam)&lt;/h2&gt;&lt;p&gt;ධාරකයක් සැපයිය යුතු සියල්ල interfaces දෙකකින් නිර්වචනය වේ:&lt;/p&gt;&lt;p&gt;&lt;code&gt;IPlatformBackend&lt;/code&gt; යෙදුම්-මට්ටමේ සේවා ආවරණය කරයි — dispatcher (&lt;code&gt;Post&lt;/code&gt;/&lt;code&gt;Invoke&lt;/code&gt;), timers, clipboard, තිර ගණනය කිරීම (screen enumeration), සහ modal loop එක. &lt;code&gt;IWindowBackend&lt;/code&gt; තනි native කවුළුවක් ආවරණය කරයි — ප්‍රමාණය සහ පිහිටීම, show/hide/close, cursor, decorations, ගොනු සංවාද කවුළු (file dialogs). ආදාන සහ paint ඉල්ලීම් ගලා යන්නේ &lt;em&gt;අනෙක්&lt;/em&gt; දිශාවටය: backend එක කවුළුවේ මධ්‍යස්ථ &lt;code&gt;RenderFrame(SKCanvas, …)&lt;/code&gt; සහ &lt;code&gt;Handle*&lt;/code&gt; methods සෘජුවම call කරයි. කිසිදු වේදිකා type එකක් — Avalonia type එකක් හෝ WinUI type එකක් — කිසි විටෙක මූලික Majorsilence.Forms කේතයට ඇතුළු නොවේ.&lt;/p&gt;&lt;h2 id=&quot;three-backends-today&quot;&gt;අද ඇති backends තුන&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Majorsilence.Forms.Avalonia&lt;/code&gt;&lt;/strong&gt; පෙරනිමියයි — Avalonia 12, කිසිදු සැකසීමකින් තොරව Windows, macOS සහ Linux desktop ලබා දෙයි. එය reference කරන්න, &lt;code&gt;Application.Run(new MyForm())&lt;/code&gt; සරලවම ක්‍රියා කරයි. එය desktop වලට පමණක් සීමා නොවේ: Avalonia එයටම ආවේණික Android, iOS සහ Browser (WASM) ඉලක්ක සපයන බැවින්, පහත විස්තර කරන කැපවූ Uno backend එකට අමතරව, මෙම backend එකම mobile සහ web වෙත දෙවන මාර්ගයකි.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Majorsilence.Forms.Headless&lt;/code&gt;&lt;/strong&gt; යනු හැකි සරලම backend එක වන අතර, නව එකක් ලිවීම සඳහා යොමු සැකිල්ල (reference template) ලෙසද ක්‍රියා කරයි: work-queue message loop එකක්, මතකය තුළ (in-memory) clipboard එකක්, අතථ්‍ය තිරයක්, සහ තිරයෙන් පිටත (offscreen) විදැහුම්කරණය. එයට display එකක් අවශ්‍ය නොවන බැවින්, unit test suite එක ධාවනය වන්නේ එය මතය, තවද CI pixel-diffing සඳහා ControlGallery නිදසුන සෘජුවම PNG එකකට විදැහුම් කළ හැකිය:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;dotnet run --project samples/ControlGallery -- --render-headless out.png 1100 750 --select-row 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Majorsilence.Forms.Uno&lt;/code&gt;&lt;/strong&gt; Uno Platform හි Skia renderer එක ඉලක්ක කරයි; &lt;code&gt;SKXamlCanvas&lt;/code&gt; එකක් ධාරණය කරමින් desktop, iOS, Android සහ WebAssembly වෙත ළඟා වේ. එය macOS මත අන්තයේ සිට අන්තය දක්වා (end-to-end) තහවුරු කර ඇත: Uno ධාරකය දියත් වේ, backend එක කවුළුව නිර්මාණය කරයි, සහ ControlGallery හි සම්පූර්ණ &lt;code&gt;MainForm&lt;/code&gt; canvas එකට විදැහුම් වේ. එයට අන්තර්ක්‍රියාකාරී session එකක් අවශ්‍ය නිසා, එය headless CI build එක හරහා නොව, කැපවූ head ව්‍යාපෘතියක් — &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/tree/main/samples/Gallery.Uno&quot;&gt;&lt;code&gt;samples/Gallery.Uno&lt;/code&gt;&lt;/a&gt; — හරහා ධාවනය වේ.&lt;/p&gt;&lt;p&gt;සඳහන් කළ යුතු එක් විස්තරයක්: Uno හි ක්‍රමලේඛනමය “කවුළු ඇදීමක් ආරම්භ කිරීමේ” (begin a window drag) API එකක් නැත, එබැවින් Majorsilence.Forms හි තමන් විසින්ම අඳින කවුළු chrome එක සඳහා move/resize ඒ වෙනුවට ප්‍රකාශනාත්මකව (declaratively) හසුරුවනු ලැබේ — borderless presenter එකක් OS resize margins නොමිලේ රඳවා ගන්නා අතර, Windows desktop head එක මත title-bar ඇදීම WinUI හි caption-region API එක භාවිත කරයි. macOS මත, ඒ වෙනුවට native decorations ඇදීම/ප්‍රමාණය වෙනස් කිරීම හසුරුවයි.&lt;/p&gt;&lt;h2 id=&quot;adding-your-own&quot;&gt;ඔබේම එකක් එක් කිරීම&lt;/h2&gt;&lt;p&gt;නව backend එකක් යනු තවත් assembly එකක් පමණි: මූලික &lt;code&gt;Majorsilence.Forms&lt;/code&gt; සහ ඔබේ toolkit එක reference කරන්න, &lt;code&gt;IPlatformBackend&lt;/code&gt; සහ &lt;code&gt;IWindowBackend&lt;/code&gt; ක්‍රියාත්මක කරන්න, සහ Avalonia/Headless/Uno ත්‍රිත්වය අනුකරණය කරන්න — platform backend එක තුළ dispatcher එක ධාවනය කරන්න, සහ window backend එක තුළ Skia surface එකක් ඉදිරිපත් කර ආදානය පරිවර්තනය කරන්න. සම්පූර්ණ interface ලැයිස්තුව සඳහා &lt;a href=&quot;/si/backends/&quot;&gt;Platform backends&lt;/a&gt; බලන්න.&lt;/p&gt;</content>
    <author><name>Majorsilence</name></author>
  </entry>
  <entry>
    <title>majorsilence-migrate සමඟ WinForms යෙදුමක් සංක්‍රමණය කිරීම</title>
    <id>https://forms.majorsilence.com/si/blog/2026/07/21/migrating-with-majorsilence-migrate/</id>
    <link href="https://forms.majorsilence.com/si/blog/2026/07/21/migrating-with-majorsilence-migrate/" rel="alternate" type="text/html"/>
    <published>2026-07-21T08:00:00+00:00</published>
    <updated>2026-07-21T08:00:00+00:00</updated>
    <summary type="text">majorsilence-migrate මඟින් WinForms solution එකක් බහු-වේදිකා .NET වෙත සංක්‍රමණය කිරීම ස්වයංක්‍රීය කරන ආකාරය — දහස් ගණනක ගොනු තත්පර කිහිපයකින් සකසන, දැනට compile නොවන ගොනු පවා හසුරුවන, හිතාමතාම පාඨමය නැවත ලියනයක්.</summary>
    <content type="html">&lt;p&gt;&lt;code&gt;majorsilence-migrate&lt;/code&gt; යනු WinForms solution එකක් Majorsilence.Forms වෙත ගෙන යාම ස්වයංක්‍රීය කරන CLI මෙවලමයි. එහි කේන්ද්‍රීය සැලසුම් තීරණය පහසුවෙන් මගහැරිය හැකි නිසා එය පැහැදිලිව සඳහන් කිරීම වටී: එය syntax tree එකක් parse කිරීම හෝ symbols විසඳීම &lt;strong&gt;නොකරයි&lt;/strong&gt;. එය අමු මූලාශ්‍ර පාඨය (raw source text) මත ක්‍රියා කරන බහු-අදියර (multi-pass) &lt;strong&gt;පාඨමය/regex නැවත ලියනයකි (rewriter)&lt;/strong&gt; — තවද එය හිතාමතාම එසේ කර ඇත.&lt;/p&gt;&lt;h2 id=&quot;why-textual-not-roslyn&quot;&gt;Roslyn නොව, පාඨමය වන්නේ ඇයි&lt;/h2&gt;&lt;p&gt;මෙවලමේම මූලාශ්‍ර comment එකෙන්: &lt;em&gt;“මෙය හිතාමතාම පාඨමය පරිවර්තනයකි — එය syntax tree එක parse නොකරයි — එමඟින් එය වේගවත්ව තබාගන්නා අතර දැනට compile නොවන ගොනු ද ඉවසයි.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;එම වෙළඳාම (trade-off) මඟින් symbol-දැනුවත් මෙවලමකට ලබා දිය නොහැකි දේවල් දෙකක් ලැබේ:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;strong&gt;එය බිඳුණු කේතය මත ක්‍රියා කරයි.&lt;/strong&gt; අර්ධ වශයෙන් සංක්‍රමණය කළ solution එකක්, කිසිවෙකු තවමත් port නොකළ type එකක් reference කරන ගොනුවක්, reference එකක් අස්ථානගත වූ project එකක් — මේ කිසිවක් නැවත ලියනය නතර නොකරයි, මන්ද කේතය compile වීම හෝ සම්පූර්ණයෙන් parse වීම පවා එයට කිසිදා අවශ්‍ය නොවේ. සැබෑ symbol විසඳීමක් සහිත Roslyn-පාදක මෙවලමක් project එක build වන තුරු එය ස්පර්ශ කිරීම ප්‍රතික්ෂේප කරනු ඇත; එය පැරණි codebase එකක් මත &lt;em&gt;පළමු වටයක&lt;/em&gt; අරමුණම පරාජය කරයි.&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;එය වේගවත්ය.&lt;/strong&gt; Compilation නැත, &lt;code&gt;MSBuildWorkspace&lt;/code&gt; නැත, project graph පූරණය කිරීමක් නැත — එය දහස් ගණනක ගොනු තත්පර කිහිපයකින් සකසයි.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;මිල: සැබෑ cross-project symbol විසඳීමක් නැත. හිස් &lt;code&gt;Panel&lt;/code&gt; reference එකක් යනු &lt;code&gt;System.Windows.Forms.Panel&lt;/code&gt; ද නැතහොත් එම නමින්ම ඇති ඔබේම class එකක් ද යන්න නැවත ලියනයට සෑම විටම කිව නොහැක — ඒ වෙනුවට එය namespace-prefix සහ &lt;code&gt;using&lt;/code&gt;/&lt;code&gt;Imports&lt;/code&gt; සන්දර්භය මත රඳා පවතී. ප්‍රායෝගිකව මෙය කලාතුරකින් අපැහැදිලි වේ (WinForms සහ Telerik type නම් සුවිශේෂී ය), තවද එය හඳුනා නොගන්නා ඕනෑම දෙයක් නිහඬව අනුමාන කරනවා වෙනුවට අතින් සමාලෝචනය සඳහා සලකුණු කරනු ලැබේ.&lt;/p&gt;&lt;h2 id=&quot;the-optional-roslyn-engine&quot;&gt;විකල්ප Roslyn engine එක&lt;/h2&gt;&lt;p&gt;සැබවින්ම අපැහැදිලි අවස්ථාව සඳහා — එකම ගොනුවේ WinForms/GDI+ type එකක් සමඟ හිස් නමක් බෙදා ගන්නා අභිරුචි type එකක් — ඔබ විසින් තෝරා ගත යුතු (opt-in) දෙවන engine එකක් ඇත: &lt;code&gt;--engine roslyn&lt;/code&gt;. එය regexes වෙනුවට &lt;code&gt;MSBuildWorkspace&lt;/code&gt; සහ සැබෑ symbol විසඳීම භාවිත කරයි; එය පාඨමය engine එක ප්‍රතිස්ථාපනය කරනවා වෙනුවට එය &lt;em&gt;මතට&lt;/em&gt; ස්තරයක් ලෙස එක් වේ; Roslyn ප්‍රකාරයේදී පවා අදියර කිහිපයක් පාඨමයව පවතී, මන්ද ඒවා කිසිදා symbol-විසඳීමේ ගැටලු නොවූ බැවිනි.&lt;/p&gt;&lt;p&gt;වෙළඳාම් පෙරනිමි engine එකට ප්‍රතිවිරුද්ධ දිශාවට ක්‍රියා කරයි: MSBuild හරහා සැබවින්ම පූරණය වන solution එකක් හෝ project එකක් එයට අවශ්‍ය වේ (හිස් directory එකක් හෝ තනි ගොනුවක් අනතුරු ඇඟවීමක් සමඟ text engine එකට ආපසු යයි), MSBuild ඇගයීම ධාවනයේ වැඩි කාලයක් ගන්නා බැවින් එය විශාලත්ව ගණනාවකින් (orders of magnitude) මන්දගාමී වේ, තවද එක් project එකක් පූරණය වීමට අසමත් වුවහොත්, එම project එකේ ගොනු පමණක් text engine එකට ආපසු යයි — ධාවනය නවතා නොදමයි. MSBuild සොයාගැනීමටම නොහැකි නම්, නිහඬව පහත් මට්ටමකට මාරු වනවා වෙනුවට සම්පූර්ණ ධාවනය දැඩි ලෙස අසාර්ථක වේ.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;එය භාවිත කළ යුත්තේ කවදාද:&lt;/strong&gt; පෙරනිමි &lt;code&gt;--engine text&lt;/code&gt; සමඟ පළමු වටයකින් පසුව, දැනටමත් පිරිසිදුව පූරණය වන project එකක, diff එකේ නිශ්චිත, තහවුරු කළ නාම-ගැටුම් (name-collision) අවස්ථාවක් ඔබ දකින්නේ නම්. විශාල, සමහරවිට අර්ධ වශයෙන් බිඳුණු පැරණි codebase එකක් මත මූලික වටය සඳහා, පෙරනිමි පාඨමය engine එක තවමත් නිවැරදි මෙවලමයි.&lt;/p&gt;&lt;h2 id=&quot;whats-next&quot;&gt;ඊළඟට කුමක්ද&lt;/h2&gt;&lt;p&gt;සම්පූර්ණ අදියරෙන්-අදියර විස්තරය සඳහා repository එකේ &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/MIGRATION.md&quot;&gt;&lt;code&gt;MIGRATION.md&lt;/code&gt;&lt;/a&gt; ද, ඔබේ සංක්‍රමණය කළ කේතය compile වූ පසු සැබවින්ම ක්‍රියාත්මක කර ඇත්තේ මොනවාද යන්න සඳහා &lt;a href=&quot;https://github.com/majorsilence/Majorsilence.Forms/blob/main/COMPATIBILITY_MATRIX.md&quot;&gt;&lt;code&gt;COMPATIBILITY_MATRIX.md&lt;/code&gt;&lt;/a&gt; ද බලන්න.&lt;/p&gt;</content>
    <author><name>Majorsilence</name></author>
  </entry>
</feed>
