<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Windows &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Mon, 31 Aug 2026 13:26:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.10</generator>
	<item>
		<title>How to code-sign Windows apps, including an automation script</title>
		<link>https://blog.xojo.com/2026/08/26/how-to-code-sign-windows-apps-including-an-automation-script/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Wed, 26 Aug 2026 16:03:14 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[azure-artifact]]></category>
		<category><![CDATA[code-signing]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=16459</guid>

					<description><![CDATA[You build a Windows app, zip it up, hand it to a user, and Windows may hit them with&#160;&#8220;Windows protected your PC&#8221;. A clean but&#8230;]]></description>
										<content:encoded><![CDATA[
<p>You build a Windows app, zip it up, hand it to a user, and Windows may hit them with&nbsp;<em>&#8220;Windows protected your PC&#8221;</em>. A clean but unsigned binary has no publisher identity or established SmartScreen reputation, so Windows has little reason to trust it.</p>



<p>This guide walks you through the complete process of signing EXE and DLL files on Windows with&nbsp;<strong>Azure Artifact Signing</strong>.</p>



<p>Here&#8217;s the shape of it, so you know what you&#8217;re signing up for:</p>



<ul class="wp-block-list">
<li><strong>One-time setup (Steps 1–9):</strong>&nbsp;Azure account, portal clicks, and identity validation. This is the slow part. Budget a day to a week for the identity check to clear.</li>



<li><strong>Every build (Step 10):</strong>&nbsp;one script that signs your exe and DLLs in seconds.</li>
</ul>



<p>If you&#8217;ve already done the setup, skip straight to&nbsp;Step 10.</p>



<h2 class="wp-block-heading" id="why-i-picked-azure-artifact-signing">Why I Picked Azure Artifact Signing</h2>



<ul class="wp-block-list">
<li><strong>$9.99/mo</strong>&nbsp;for up to 5,000 signatures (Basic tier), with no USB hardware token to manage.</li>



<li><strong>Fully managed.</strong>&nbsp;Microsoft rotates the certificates daily behind the scenes. You never see or store a private key.</li>



<li><strong>Identity-based publisher reputation.</strong>&nbsp;Public Trust signing ties the signature to your validated identity instead of a certificate you manage yourself. SmartScreen warnings can still appear for first-time or low-volume downloads; signing does not guarantee they will disappear immediately.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>A note on names:</strong>&nbsp;this service was called &#8220;Azure Trusted Signing&#8221; until recently. Same thing, new name. If you see &#8220;Trusted Signing&#8221; in older docs or screenshots, it&#8217;s the same service.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="prerequisites">Prerequisites</h2>



<ol class="wp-block-list">
<li>A Microsoft account (you get one when you sign up with Azure).</li>



<li>A&nbsp;<strong>paid Azure subscription.</strong>&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> This is the #1 early blocker: Artifact Signing&nbsp;<strong>does not work on free/trial/sponsored subscriptions.</strong>&nbsp;Upgrade to&nbsp;<strong>pay-as-you-go</strong>&nbsp;first (Cost Management + Billing → your subscription → upgrade) &#8211;&nbsp;<a href="https://azure.microsoft.com/en-us/products/artifact-signing" target="_blank" rel="noreferrer noopener">https://azure.microsoft.com/en-us/products/artifact-signing</a>.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-1--register-the-resource-provider">Step 1 — Register the resource provider</h2>



<p>Quick orientation first: an Azure&nbsp;<strong>subscription</strong>&nbsp;is the billing container for everything you create. Azure charges your services to it, and it also defines where those resources live and who can access them. When you signed up, Azure created one for you automatically (often with a forgettable default name like &#8220;Azure subscription 1&#8221;).</p>



<p>A separate subscription is optional. If you want clean billing and access boundaries for signing, create or dedicate one; otherwise, use your existing paid subscription and keep the signing resources in a dedicated resource group.</p>



<p>Then:</p>



<ol class="wp-block-list">
<li>Portal →&nbsp;<strong>Subscriptions</strong>&nbsp;→ the subscription you chose.</li>



<li>Left menu →&nbsp;<strong>Settings → Resource providers</strong>.</li>



<li>Find&nbsp;<strong><code>Microsoft.CodeSigning</code></strong>&nbsp;→ click the&nbsp;<strong>…</strong>&nbsp;→&nbsp;<strong>Register</strong>. Wait for&nbsp;<strong>Registered</strong>.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-2--create-the-artifact-signing-account">Step 2 — Create the Artifact Signing account</h2>



<p>Keep the signing resources together in the same subscription and a dedicated resource group.</p>



<ol class="wp-block-list">
<li>Portal search →&nbsp;<strong>Artifact Signing Accounts → Create</strong>.</li>



<li><strong>Subscription</strong>: the paid subscription you chose.&nbsp;<strong>Resource group</strong>: new, e.g.&nbsp;<code>rg-artifact-signing</code>.</li>



<li><strong>Account name</strong>: 3–24 alphanumeric, starts with a letter,&nbsp;<strong>globally unique</strong>&nbsp;(no consecutive hyphens). e.g.&nbsp;<code>xojoappsigning</code>.</li>



<li><strong>Region</strong>: pick one you&#8217;ll remember; it determines your signing endpoint.</li>



<li><strong>Pricing</strong>:&nbsp;<strong>Basic</strong>&nbsp;unless you&#8217;ll exceed 5,000 signs/month.</li>



<li>Create, then note the&nbsp;<strong>Account URI</strong>&nbsp;on the overview page. It follows the pattern&nbsp;<code>https://&lt;region-code&gt;.codesigning.azure.net/</code>.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-3--assign-the-identity-verifier-role">Step 3 — Assign the Identity Verifier role</h2>



<p>You need this before the identity-validation button becomes clickable.</p>



<ol class="wp-block-list">
<li>From your Artifact Signing account, left menu →&nbsp;<strong>Access control (IAM)</strong>&nbsp;→&nbsp;<strong>Add role assignment</strong>.</li>



<li>Role:&nbsp;<strong>Artifact Signing Identity Verifier</strong>&nbsp;(use the search field) → assign to&nbsp;<strong>your own user account</strong>.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-4--identity-validation-the-real-gate">Step 4 — Identity validation (the real gate)</h2>



<p>From your Artifact Signing account (the one you created in Step 2), go to the left menu →&nbsp;<strong>Objects → Identity validations</strong>&nbsp;→&nbsp;<strong>New Identity</strong>&nbsp;→&nbsp;<strong>Public</strong>.</p>



<p><strong>Public</strong>&nbsp;is what you want for normal app signing (it&#8217;s what SmartScreen cares about).</p>



<p>Fill in your legal business name, website, emails, business identifier (tax ID / DUNS), and address. Two gotchas that bite everyone:</p>



<ul class="wp-block-list">
<li>The&nbsp;<strong>secondary email must be on the same domain as the primary</strong>.</li>



<li><strong>Individual developers</strong>: the form pulls from your Azure&nbsp;<em>billing account</em>, and its name/address must exactly match your ID.</li>
</ul>



<p><strong>What happens next:</strong>&nbsp;status goes&nbsp;<code>In Progress</code>&nbsp;→&nbsp;<code>Action Required</code>&nbsp;(this is the point when you may have to wait a few hours to days&#8230; In my case, it took only an hour). You&#8217;ll be routed through a third-party verifier (<strong>AU10TIX</strong>). You upload a government ID and a selfie from your phone, then add the resulting&nbsp;<strong>Verified ID to Microsoft Authenticator</strong>&nbsp;and share it back (another hour or so).</p>



<p><strong>Timeline:</strong>&nbsp;officially 1–20 business days; in practice often hours to a few days. If it stalls, re-submit with a different identifier (tax ID instead of DUNS) and make sure your company name/address match your documents&nbsp;<em>exactly</em>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-5--create-the-certificate-profile">Step 5 — Create the certificate profile</h2>



<ol class="wp-block-list">
<li>From your Artifact Signing account, left menu →&nbsp;<strong>Objects → Certificate profiles</strong>&nbsp;→&nbsp;<strong>Create</strong>.</li>



<li>Type:&nbsp;<strong>Public Trust</strong>.</li>



<li>Name it (5–100 chars), then pick your completed identity validation under&nbsp;<strong>Verified CN and O</strong>.</li>



<li>Create. You never see or hold the certificate. It&#8217;s rotated daily behind the scenes. The public cert is embedded in every file you sign.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-6--assign-the-certificate-profile-signer-role">Step 6 — Assign the Certificate Profile Signer role</h2>



<p>This is the role that lets you actually sign. Because we&#8217;re using the Azure CLI, it goes on&nbsp;<strong>your user</strong>. No app registration is needed (this is a separate/alternative process, but we&#8217;re not talking about that in this article).</p>



<ol class="wp-block-list">
<li>From your Artifact Signing account, left menu →&nbsp;<strong>Access control (IAM)</strong>&nbsp;→&nbsp;<strong>Add role assignment</strong>.</li>



<li>Role:&nbsp;<strong>Artifact Signing Certificate Profile Signer</strong>&nbsp;→ assign to&nbsp;<strong>your own user account</strong>.</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Give role assignments a few minutes to propagate. If you try signing immediately and hit a 403, wait ~5 minutes and retry.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-7--install-the-signing-tools">Step 7 — Install the signing tools</h2>



<p>First, the <strong>Azure CLI</strong>: <code>winget install Microsoft.AzureCLI</code></p>



<p><em>You’ll use it in Step 9 to authenticate with Azure.</em></p>



<p><strong>SignTool</strong>&nbsp;comes with the Windows SDK. Install it with: <code>winget install --id Microsoft.WindowsSDK --exact</code></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Run this to find the newest x64&nbsp;signtool.exe:<br><code>Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin" -Recurse -Filter signtool.exe | Where-Object { $_.FullName -match '\\x64\\signtool\.exe$' } | Sort-Object FullName -Descending | Select-Object -First 1 -ExpandProperty FullName</code></p>



<p><em>Note the path down.</em></p>



<p><strong>.NET 8 runtime</strong>&nbsp;(x64).</p>



<p><strong>Microsoft Visual C++ Redistributable</strong>.</p>



<p><strong>Artifact Signing Client Tools</strong>:<code>winget install -e --id Microsoft.Azure.ArtifactSigningClientTools</code><br>This installs&nbsp;<code>Azure.CodeSigning.Dlib.dll</code>&nbsp;(the plugin signtool uses to talk to Azure).</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Locate the actual dll path after install:<br><code>Get-ChildItem -Path "C:\Program Files","$env:LOCALAPPDATA" -Recurse -Filter Azure.CodeSigning.Dlib.dll -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName</code></p>



<p><em>Note the path down.</em></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>If&nbsp;<code>signtool</code>&nbsp;gives you &#8220;command not found&#8221;, that&#8217;s normal; it&#8217;s not on PATH. Use the full path, or add&nbsp;<code>...\10\&lt;version&gt;\x64</code>&nbsp;to your PATH.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-8--create-the-metadata-file">Step 8 — Create the metadata file</h2>



<p>This is a small JSON with three values. Name it anything you like, e.g.&nbsp;<code>artifact-code-signing.json</code>:</p>



<pre class="wp-block-code"><code>{
	"Endpoint": "https://&lt;region-code&gt;.codesigning.azure.net",
	"CodeSigningAccountName": "xojoappsigning",
	"CertificateProfileName": "...."
}</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>This JSON file will be used a lot, so save it somewhere safe.</p>
</blockquote>



<ul class="wp-block-list">
<li><strong>Endpoint</strong>&nbsp;= your account URI (region-specific; must match where the account + profile live, or you get a 403).</li>



<li><strong>CodeSigningAccountName</strong>&nbsp;= the Artifact Signing account name from Step 2.</li>



<li><strong>CertificateProfileName</strong>&nbsp;= the certificate profile name you created in Step 5.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-9--authenticate-with-the-azure-cli">Step 9 — Authenticate with the Azure CLI</h2>



<pre class="wp-block-code"><code>az login</code></pre>



<p>This opens your browser; sign in with the Microsoft account tied to your Azure subscription. When signtool runs, the dlib picks up your logged-in Azure CLI session automatically.</p>



<p>If you have multiple Azure subscriptions, point the CLI at the right one, then confirm it took:</p>



<pre class="wp-block-code"><code>az account set --subscription "&lt;your subscription id&gt;"
az account show --query name -o tsv</code></pre>



<p>The second command should print your code-signing subscription&#8217;s name. If you also have multiple Microsoft tenants (a personal account&nbsp;<em>and</em>&nbsp;a work account, for example), log straight into the right one:</p>



<pre class="wp-block-code"><code>az login --tenant "&lt;tenant id&gt;"</code></pre>



<p>You may occasionally need to re-run&nbsp;<code>az login</code>&nbsp;after long idle periods.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="step-10--sign-your-xojo-app">Step 10 — Sign your Xojo app</h2>



<p>Just remember, you need to&nbsp;<strong>sign the compiled application after each new build</strong>.</p>



<h3 class="wp-block-heading" id="what-to-sign-and-skip">What to sign (and skip)</h3>



<p>Your Xojo Windows build folder looks roughly like this. Sign the binaries you build or distribute under your publisher identity; leave Xojo, Microsoft, and other vendor-signed dependencies alone.</p>



<pre class="wp-block-code"><code>Windows 64 bit/
└── YourApp/
    ├── YourApp.exe              ← sign
    ├── &lt;your own DLLs&gt;          ← sign
    ├── XojoGUIFramework64.dll   ← skip, Xojo provides signed DLLs
    ├── YourApp Libs/            ← skip, Xojo provides signed DLLs
    ├── msvcp140.dll, vcruntime*.dll …  ← skip (Microsoft runtime)
    └── YourApp.exe.WebView2/    ← skip (WebView2 cache)
</code></pre>



<h3 class="wp-block-heading" id="the-script">The script</h3>



<p>Save this as&nbsp;<code>sign.ps1</code>, next to the Xojo project, update the paths at the top, and run it from PowerShell:</p>



<pre class="wp-block-code"><code>$ErrorActionPreference = "Stop"

$Signtool    = "C:\...\signtool.exe"                            <em># path from Step 7</em>
$Dlib        = "C:\...\Azure.CodeSigning.Dlib.dll"              <em># path from Step 7</em>
$Metadata    = "C:\...\artifact-code-signing.json"              <em># from Step 8</em>
$BuildFolder = "F:\...\YourApp"                                 <em># folder containing YourApp.exe</em>

<em># Installer (Inno Setup) — optional. Set $EnableInno to $false to skip this part.</em>
$EnableInno  = $true
$InnoSetup   = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
$IssScript   = "F:\...\YourAppSetup.iss"                        <em># your Inno Setup script</em>
$Installer   = "F:\...\YourAppSetup.exe"                        <em># output from the .iss</em>

<em># Sign binaries you build or distribute under your publisher identity.</em>
<em># Leave Xojo, Microsoft, and other vendor-signed dependencies alone.</em>
$FilesToSign = @(
    "$BuildFolder\YourApp.exe"
    "$BuildFolder\MyPlugin.dll"
    <em># add any other files you own here, one per line</em>
)

function Invoke-SigningCommand {
    param(&#91;string&#91;]]$Arguments)

    &amp; $Signtool @Arguments
    if ($LASTEXITCODE -ne 0) {
        throw "SignTool failed with exit code $LASTEXITCODE."
    }
}

foreach ($f in $FilesToSign) {
    Invoke-SigningCommand @(
        "sign", "/v", "/fd", "SHA256",
        "/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256",
        "/dlib", $Dlib, "/dmdf", $Metadata,
        $f
    )
}

if ($EnableInno) {
    <em># Build a fresh installer, then sign it.</em>
    &amp; $InnoSetup $IssScript
    if ($LASTEXITCODE -ne 0) {
        throw "Inno Setup failed with exit code $LASTEXITCODE."
    }

    Invoke-SigningCommand @(
        "sign", "/v", "/fd", "SHA256",
        "/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256",
        "/dlib", $Dlib, "/dmdf", $Metadata,
        $Installer
    )
}</code></pre>



<p>What the flags mean:</p>



<ul class="wp-block-list">
<li><code>/tr http://timestamp.acs.microsoft.com</code>: the timestamp server. The&nbsp;<code>http://</code>&nbsp;(not https) is intentional.</li>



<li><code>/fd SHA256</code>&nbsp;and&nbsp;<code>/td SHA256</code>: SHA-256 for the file and the timestamp.</li>



<li><code>/dlib</code>: the Azure plugin from Step 7.&nbsp;<code>/dmdf</code>: your metadata JSON from Step 8.</li>
</ul>



<h3 class="wp-block-heading" id="confirm-it-worked">Confirm it worked</h3>



<p>Two checks:</p>



<ol class="wp-block-list">
<li><strong>Signtool:</strong><code>$Signtool verify /v /pa "$BuildFolder\YourApp.exe" </code>You want to see&nbsp;<code>Successfully verified</code>.</li>



<li><strong>Or:</strong>&nbsp;right-click&nbsp;<code>YourApp.exe</code>&nbsp;→&nbsp;<strong>Properties → Digital Signatures</strong>&nbsp;→ your org name should be listed.</li>
</ol>



<h3 class="wp-block-heading" id="rules-of-thumb">Rules of thumb</h3>



<ul class="wp-block-list">
<li><strong>Sign after every build.</strong>&nbsp;Each new&nbsp;<code>.exe</code>&nbsp;is a fresh unsigned binary.</li>



<li><strong>Sign before you zip.</strong>&nbsp;Sign the files,&nbsp;<em>then</em>&nbsp;package them. Signing inside a zip does nothing.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="troubleshooting">Troubleshooting</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Symptom</th><th class="has-text-align-left" data-align="left">Fix</th></tr></thead><tbody><tr><td><code>signtool: command not found</code></td><td>Use the full SDK path; it&#8217;s not on PATH</td></tr><tr><td><code>No certificates were found</code></td><td>dlib path wrong, or x86/x64 mismatch between signtool and dlib</td></tr><tr><td><code>403 Forbidden</code></td><td>Signer role on the wrong account, wrong account name in JSON, or endpoint/region mismatch</td></tr><tr><td><code>SignTool Error: An unexpected internal error</code></td><td>Update signtool to ≥ 10.0.22621.755; check .NET 8 + VC++ redist</td></tr><tr><td>Signing appeared to succeed, but no signature is visible</td><td>Run&nbsp;<code>signtool verify /v /pa &lt;file&gt;</code>; its exit code and&nbsp;<code>Successfully verified</code>&nbsp;output are authoritative. Explorer&#8217;s Digital Signatures tab is not available for every file type.</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="recap">Recap</h2>



<p><strong>One time (Steps 1–9):</strong>&nbsp;register the&nbsp;<code>Microsoft.CodeSigning</code>&nbsp;provider → create the account → assign the Identity Verifier role → complete identity validation (slow&#8217;ish) → create the certificate profile → assign the Signer role → install tools → write the metadata JSON →&nbsp;<code>az login</code>.</p>



<p><strong>Every build (Step 10):</strong>&nbsp;run&nbsp;<code>sign.ps1</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="the-bottom-line">The bottom line</h2>



<p>Azure Artifact Signing is a low-cost managed option for signing Windows apps, and Azure CLI authentication means local builds do not need a stored signing private key. The setup has some Azure bureaucracy, and identity validation is the slow part. After that, it is one script per build.</p>



<h4 class="wp-block-heading">Related discussion</h4>



<p>For an alternative approach that automates Xojo application signing and Inno Setup installer creation, see Jürg Otter’s Xojo Forum topic, <a href="https://forum.xojo.com/t/windows-code-signing-installer-creation-with-innosetup/84732" target="_blank" rel="noreferrer noopener">Windows Code Signing &amp; Installer Creation with Inno Setup</a>. The topic includes Jürg’s open-source code, which supports both Azure Artifact Signing and traditional <code>.pfx</code> certificates.</p>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p class="has-text-align-center has-text-color has-link-color wp-elements-a0a2ac26ad214a49dac577734d259176" style="color:#84bd00"><a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Download Xojo</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Enhanced Emoji Support: A Look into Graphics and String.Character Improvements</title>
		<link>https://blog.xojo.com/2024/06/26/enhanced-emoji-support-a-look-into-graphics-and-string-character-improvements/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 15:00:00 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[20242r2]]></category>
		<category><![CDATA[Emoji]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Unicode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13136</guid>

					<description><![CDATA[Now in Xojo 2024r2, we've enhanced emojis with vivid colors!]]></description>
										<content:encoded><![CDATA[
<p>In the past, people used a two-character symbol : ) to add a smiley to their messages. Nowadays, we have full-color emojis for that purpose, so it&#8217;s time for Xojo to catch up unless we want to be seen as old <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f995.png" alt="🦕" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<h2 class="wp-block-heading">Enhanced Emoji Rendering</h2>



<p>While Xojo&#8217;s Graphics class supported rendering emojis on Windows and Linux, their appearance was less appealing.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"><div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="454" height="377" data-id="13137" src="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1.png" alt="" class="wp-image-13137" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1.png 454w, https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1-300x249.png 300w" sizes="(max-width: 454px) 100vw, 454px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="303" height="263" data-id="13143" src="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1Linux-1.png" alt="" class="wp-image-13143" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1Linux-1.png 303w, https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r1Linux-1-300x260.png 300w" sizes="(max-width: 303px) 100vw, 303px" /></figure>
</div></figure>



<p>Now in Xojo 2024r2, we&#8217;ve enhanced emojis with vivid colors!</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex"><div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="454" height="377" data-id="13138" src="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2.png" alt="" class="wp-image-13138" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2.png 454w, https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2-300x249.png 300w" sizes="(max-width: 454px) 100vw, 454px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="303" height="263" data-id="13142" src="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2Linux-1.png" alt="" class="wp-image-13142" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2Linux-1.png 303w, https://blog.xojo.com/wp-content/uploads/2024/06/Emoji2024r2Linux-1-300x260.png 300w" sizes="auto, (max-width: 303px) 100vw, 303px" /></figure>
</div></figure>



<p>You’ll notice that other parts of the Xojo framework that utilize the Graphics class, such as the ListBox, have also benefited from this update.</p>



<h2 class="wp-block-heading">Understanding Emojis at a Deeper Level</h2>



<p>Understanding how emojis are encoded is crucial for grasping how Xojo&#8217;s String type works and how we interpret them. Any text or emoji displayed on the screen can be considered a Unicode sequence or a series of Unicode sequences. At a deeper level, a single Unicode sequence can be constructed from multiple Unicode code points (i.e., bytes of data). For clarity, we&#8217;ll describe one character<strong> </strong>(whether simple text or an emoji) as being composed of Unicode sequence(s).</p>



<p>To demonstrate, let&#8217;s try to understand the woman <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f469.png" alt="👩" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<div class="wp-block-media-text is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="913" height="628" src="https://blog.xojo.com/wp-content/uploads/2024/06/Woman1.png" alt="" class="wp-image-13149 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Woman1.png 913w, https://blog.xojo.com/wp-content/uploads/2024/06/Woman1-300x206.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/Woman1-768x528.png 768w" sizes="auto, (max-width: 913px) 100vw, 913px" /></figure><div class="wp-block-media-text__content">
<p>This particular woman is not very complex, it is made up of one single Unicode sequence (with corresponding code points).  Our String type can easily handle this one Unicode sequence and reports correctly that the Length of the String is 1 (even though the entire emoji is made up of 4 bytes of code points).</p>
</div></div>



<p>Now let&#8217;s take a look at a more complicated woman <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f469-200d-1f9b0.png" alt="👩‍🦰" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<div class="wp-block-media-text is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="916" height="631" src="https://blog.xojo.com/wp-content/uploads/2024/06/Woman2-1.png" alt="" class="wp-image-13148 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Woman2-1.png 916w, https://blog.xojo.com/wp-content/uploads/2024/06/Woman2-1-300x207.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/Woman2-1-768x529.png 768w" sizes="auto, (max-width: 916px) 100vw, 916px" /></figure><div class="wp-block-media-text__content">
<p>The only difference visually is that this woman has fiery red hair.  This subtle change in appearance means that to construct this emoji requires not 1, not 2, but 3 distinct Unicode sequences (with a grand total of 11 bytes of code points).</p>
</div></div>



<p>Note that the reported length of the String is 3 Unicode sequences, even though we visually see only one character. This distinction is very important in understanding how String functions work. Xojo&#8217;s String functions inherently deal with Unicode sequences, not individual characters. When you do need to work with complex emojis like these, you will want to utilize our String.Characters API which effectively manages this complexity.</p>



<h2 class="wp-block-heading">An Optimized String.Characters</h2>



<p>Given the prevalence of emojis in everyday text and messages, properly handling them within Xojo&#8217;s String type is crucial. While we initially introduced this feature as String.Characters, it functioned as an iterator until Xojo 2024r2. Now, String.Characters returns a String array, which can still be iterated, ensuring existing code continues to work as before. Additionally, this update offers the added advantage of significantly improved speed, especially on Windows and Linux. Along with this update, we introduced String.CharacterCount, which is useful when you need to know the number of characters in a string without storing them all in an array.</p>



<p>To further understand emojis and their corresponding Unicode sequences, check out this <a href="https://www.unicode.org/emoji/charts/full-emoji-list.html">Full Emoji List</a>.</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p class="has-text-align-center has-text-color has-link-color wp-elements-a0a2ac26ad214a49dac577734d259176" style="color:#84bd00"><a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Download Xojo</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TabPanel has Finally Joined the Dark Side</title>
		<link>https://blog.xojo.com/2024/03/26/tabpanel-has-finally-joined-the-dark-side/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 15:26:49 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[2024r1]]></category>
		<category><![CDATA[DarkMode]]></category>
		<category><![CDATA[DesktopXAMLContainer]]></category>
		<category><![CDATA[TabPanel]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12752</guid>

					<description><![CDATA[Xojo's TabPanel on Windows has fought hard to stay on the light side by making the dark mode transition annoyingly difficult, but at long last it has given up the fight and has embraced the dark side.]]></description>
										<content:encoded><![CDATA[
<p>Xojo&#8217;s TabPanel on Windows has fought hard to stay on the light side by making the dark mode transition annoyingly difficult, but at long last it has given up the fight and has embraced the dark side.</p>



<figure class="wp-block-video"><video height="1080" style="aspect-ratio: 1920 / 1080;" width="1920" autoplay controls loop src="https://blog.xojo.com/wp-content/uploads/2024/03/LightToDarkRepeat.mp4"></video></figure>



<p>Supporting dark mode with Win32 controls is never an easy exercise, but if you&#8217;ve been following along with our work to modernize our Windows framework with XAML, then you may have already updated your apps with the XAML TabView control that natively supports dark mode.</p>



<figure class="wp-block-video"><video height="1080" style="aspect-ratio: 1920 / 1080;" width="1920" autoplay controls loop src="https://blog.xojo.com/wp-content/uploads/2024/03/XAMLTabPanel.mp4"></video></figure>



<p>Simply plug this bit of XAML into our DesktopXAMLContainer Content property and you&#8217;ve got yourself a modern looking TabPanel that already supported dark mode even before we did.</p>



<pre class="wp-block-code"><code>&lt;winui:TabView&gt;
	&lt;winui:TabView.TabItems&gt;
		&lt;winui:TabViewItem Header="Tab 1"&gt;
			&lt;StackPanel&gt;
				&lt;TextBlock Text="This is Tab 1" Margin="5"/&gt;
				&lt;Button Content="Button 1" Margin="5"/&gt;
				&lt;CheckBox Content="Checkbox 1" IsChecked="True" Margin="5"/&gt;
			&lt;/StackPanel&gt;
		&lt;/winui:TabViewItem&gt;
		&lt;winui:TabViewItem Header="Tab 2"&gt;
			&lt;StackPanel&gt;
				&lt;TextBlock Text="This is Tab 2" Margin="5"/&gt;
				&lt;TextBox Text="Enter text here" Margin="5"/&gt;
				&lt;ComboBox Margin="5"&gt;
					&lt;ComboBoxItem Content="Item 1"/&gt;
					&lt;ComboBoxItem Content="Item 2"/&gt;
					&lt;ComboBoxItem Content="Item 3"/&gt;
				&lt;/ComboBox&gt;
			&lt;/StackPanel&gt;
		&lt;/winui:TabViewItem&gt;
	&lt;/winui:TabView.TabItems&gt;
&lt;/winui:TabView&gt;</code></pre>



<p>While people debate on which mode (light or dark) they prefer to work in, you can ultimately control whether you want to support dark mode or not in your app by toggling the &#8220;Supports Dark Mode&#8221; build setting.  For an example on how to dynamically switch between dark and light mode in your app using XAML, see the XAML ButtonStyling example project and the RequestedTheme property.</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p class="has-text-align-center has-text-color has-link-color wp-elements-a0a2ac26ad214a49dac577734d259176" style="color:#84bd00"><a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Download Xojo</a></p>
]]></content:encoded>
					
		
		<enclosure url="https://blog.xojo.com/wp-content/uploads/2024/03/LightToDarkRepeat.mp4" length="1852724" type="video/mp4" />
<enclosure url="https://blog.xojo.com/wp-content/uploads/2024/03/XAMLTabPanel.mp4" length="801534" type="video/mp4" />

			</item>
		<item>
		<title>Doing More With DesktopXAMLContainer</title>
		<link>https://blog.xojo.com/2023/08/09/doing-more-with-desktopxamlcontainer/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[WinUI]]></category>
		<category><![CDATA[XAML]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11776</guid>

					<description><![CDATA[With the introduction of DesktopXAMLContainer you can slowly modernize your Windows apps or supplement your existing user interface with additional WinUI controls. In this tutorial I'll demonstrate how you can do more with XAML.]]></description>
										<content:encoded><![CDATA[
<p>With the introduction of DesktopXAMLContainer you can slowly modernize your Windows apps or supplement your existing user interface with additional WinUI controls. If you are new to XAML, read my earlier post <a href="https://blog.xojo.com/2023/08/09/introducing-desktopxamlcontainer/">Introducing DesktopXAMLContainer</a> to begin. In this tutorial I&#8217;ll demonstrate how you can do more with XAML.</p>



<h3 class="wp-block-heading"><strong>Doing More With Layouts</strong></h3>



<p>While you can certainly add a single WinUI control in a DesktopXAMLContainer, you can also aggregate controls on the container to improve things. XAML makes it possible to customize the layout of your controls using mark-up instead of laying out your controls (one by one) on your window and adjusting the position by hand. Take for example a set of buttons that you want to layout vertically on your window. While you can certainly position three individual buttons on your layout, you could also accomplish this using one DesktopXAMLContainer with the StackPanel layout.</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:36% auto"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="454" height="347" src="https://blog.xojo.com/wp-content/uploads/2023/07/VerticalButtons-1.png" alt="" class="wp-image-11780 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/VerticalButtons-1.png 454w, https://blog.xojo.com/wp-content/uploads/2023/07/VerticalButtons-1-300x229.png 300w" sizes="auto, (max-width: 454px) 100vw, 454px" /></figure><div class="wp-block-media-text__content">
<p></p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;StackPanel Orientation="Vertical"&gt;
  &lt;Button Content="Button 1"/&gt;
  &lt;Button Content="Button 2"
           Margin="0,10,0,0"/&gt;
  &lt;Button Content="Button 3"
           Margin="0,10,0,0"/&gt;
&lt;/StackPanel&gt;</code></code></pre>
</div></div>



<p>Without any dragging or dropping, you can re-configure this layout to be horizontal instead.</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:36% auto"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="454" height="347" src="https://blog.xojo.com/wp-content/uploads/2023/07/HorizontalButtons.png" alt="" class="wp-image-11783 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/HorizontalButtons.png 454w, https://blog.xojo.com/wp-content/uploads/2023/07/HorizontalButtons-300x229.png 300w" sizes="auto, (max-width: 454px) 100vw, 454px" /></figure><div class="wp-block-media-text__content">
<p></p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;StackPanel Orientation="Horizontal"&gt;
  &lt;Button Content="Button 1"/&gt;
  &lt;Button Content="Button 2"
           Margin="10,0,0,0"/&gt;
  &lt;Button Content="Button 3"
           Margin="10,0,0,0"/&gt;
&lt;/StackPanel&gt;</code></code></pre>
</div></div>



<h3 class="wp-block-heading">Handling Events</h3>



<p>In the case of a single WinUI button in a DesktopXAMLContainer, handling events is a simple check in EventTriggered for the &#8220;Click&#8221; eventName. With multiple buttons in a DesktopXAMLContainer, you will want to properly Name them to determine which button was clicked.</p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;StackPanel Orientation="Vertical"&gt;
  &lt;Button Name="Button1" Content="Button 1"/&gt;
  &lt;Button Name="Button2" Content="Button 2"
           Margin="0,10,0,0"/&gt;
  &lt;Button Name="Button3" Content="Button 3"
           Margin="0,10,0,0"/&gt;
&lt;/StackPanel&gt;</code></code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://blog.xojo.com/wp-content/uploads/2023/07/DebugEventTriggered-1024x493.png" alt="" class="wp-image-11787" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/DebugEventTriggered-1024x493.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/07/DebugEventTriggered-300x144.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/DebugEventTriggered-768x370.png 768w, https://blog.xojo.com/wp-content/uploads/2023/07/DebugEventTriggered.png 1219w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can inspect the parameters Dictionary to see what other Keys are available for a particular control and event. All controls will have at least the three basic keys: the fully qualified XAML <strong>Class</strong> name, the <strong>Name</strong> of the control, and the additional <strong>Tag</strong> property. Some controls will have additional Keys populated in the Dictionary, for example the XAML CheckBox control will fire a ValueChanged event with an IsChecked Key available in the parameters Dictionary. The specific names for these Keys can be found in the XAML Control Chooser Window.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2023/07/IsCheckedKey.png" alt="" class="wp-image-11789" width="627" height="461" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/IsCheckedKey.png 979w, https://blog.xojo.com/wp-content/uploads/2023/07/IsCheckedKey-300x221.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/IsCheckedKey-768x566.png 768w" sizes="auto, (max-width: 627px) 100vw, 627px" /></figure>
</div>


<h3 class="wp-block-heading">Doing More With Code Behind</h3>



<p>There will be instances where you may want to setup your control dynamically in code. The available properties/methods that a particular XAML control supports in the XAML Control Chooser window are documented. These properties and methods can be accessed using the DesktopXAMLContainer&#8217;s Value and Invoke methods. Let&#8217;s take the simple example of a Button. While you could set this all up using just XAML code, there may be times that you want to only change the caption of the Button in code. To do this you can use the Value method:</p>



<pre id="Xojo" class="wp-block-code"><code><code>XAMLContainer1.Value("Content") = "My new caption"</code></code></pre>



<p>Equivalently, you could also set this up using only XAML code:</p>



<pre id="Xojoo" class="wp-block-code"><code><code>XAMLContainer1.Content = "&lt;Button Content='My new caption'/&gt;"</code></code></pre>



<p>If you have multiple Buttons in your DesktopXAMLContainer (like in our StackPanel example above), you can reference the control using a fully qualified name space:</p>



<pre id="Xojo" class="wp-block-code"><code><code>XAMLContainer1.Value("Button2.Content") = "My new caption"</code></code></pre>



<p>Conversely, if you wanted to know what the caption of Button3 is, you can use the Value to get it too:</p>



<pre id="Xojo" class="wp-block-code"><code><code>myCaption = XAMLContainer1.Value("Button3.Content")</code></code></pre>



<h3 class="wp-block-heading">Some Properties/Methods Support Embedded XAML Code</h3>



<div class="wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile"><div class="wp-block-media-text__content">
<p></p>



<p>If you take a look at the Button Content property, we&#8217;ve documented it with a note about it supporting XAML code. This means you can insert XAML code instead of just a basic string. So if you wanted to embed a ProgressRing inside a Button you could add that using the Content property.</p>
</div><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="979" height="722" src="https://blog.xojo.com/wp-content/uploads/2023/07/ContentSupportsXAML.png" alt="" class="wp-image-11791 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/ContentSupportsXAML.png 979w, https://blog.xojo.com/wp-content/uploads/2023/07/ContentSupportsXAML-300x221.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/ContentSupportsXAML-768x566.png 768w" sizes="auto, (max-width: 979px) 100vw, 979px" /></figure></div>



<pre id="Xojo" class="wp-block-code"><code><code>XAMLContainer1.Value("Content") = "&lt;ProgressRing /&gt;"</code></code></pre>



<p>This would be the equivalent XAML code:</p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;Button&gt;
  &lt;ProgressRing /&gt;
&lt;/Button&gt;</code></code></pre>



<h3 class="wp-block-heading">What is this winui namespace?</h3>



<p>You may notice that some controls, added via the XAML Control Chooser window, use the winui namespace when you inspect the Content. Those particular controls are using the more modern UI look and feel. See <a href="https://learn.microsoft.com/en-us/uwp/api/microsoft.ui.xaml.controls" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/en-us/uwp/api/microsoft.ui.xaml.controls</a><br>some controls offer the older style equivalent, see <a href="https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls</a><br>One such control is the ProgressRing. If you prefix this with winui, you&#8217;ll get the updated look, while the previous iteration can be seen without the winui prefix.</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:15% auto"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="150" height="108" src="https://blog.xojo.com/wp-content/uploads/2023/07/progressring_indeterminate.gif" alt="" class="wp-image-11793 size-full"/></figure><div class="wp-block-media-text__content">
<p></p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;winui:ProgressRing /&gt;</code></code></pre>
</div></div>



<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:15% auto"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="440" height="440" src="https://blog.xojo.com/wp-content/uploads/2023/07/fluidprogressring.gif" alt="" class="wp-image-11795 size-full"/></figure><div class="wp-block-media-text__content">
<p></p>



<pre id="Xojo" class="wp-block-code"><code><code>&lt;ProgressRing /&gt;</code></code></pre>
</div></div>



<div style="height:46px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Custom Binding</h3>



<div class="wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile" style="grid-template-columns:auto 68%"><div class="wp-block-media-text__content">
<p>Xojo supports a new mark-up syntax called {XojoBinding} specifically to help with re-usability of XAML controls. This currently only binds at the layout/IDE layer, but can be useful for re-usability purposes. As in this example you can customize the look of a Button by changing some properties in the inspector.</p>
</div><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="1024" height="675" src="https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses-1024x675.png" alt="" class="wp-image-11797 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses-1024x675.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses-300x198.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses-768x506.png 768w, https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses-1536x1013.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/07/XAMLSubclasses.png 1888w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></div>



<p>To set this up you will need to subclass a DesktopXAMLContainer and add the properties you want exposed in the inspector.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="668" src="https://blog.xojo.com/wp-content/uploads/2023/07/ExposeInspectorProps-1024x668.png" alt="" class="wp-image-11801" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/ExposeInspectorProps-1024x668.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/07/ExposeInspectorProps-300x196.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/ExposeInspectorProps-768x501.png 768w, https://blog.xojo.com/wp-content/uploads/2023/07/ExposeInspectorProps.png 1091w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You will then need to add the necessary {XojoBinding} calls in the Content of your XAML:</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="785" height="497" src="https://blog.xojo.com/wp-content/uploads/2023/07/EditSourceForBinding-1.png" alt="" class="wp-image-11804 size-full" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/EditSourceForBinding-1.png 785w, https://blog.xojo.com/wp-content/uploads/2023/07/EditSourceForBinding-1-300x190.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/EditSourceForBinding-1-768x486.png 768w" sizes="auto, (max-width: 785px) 100vw, 785px" /></figure><div class="wp-block-media-text__content">
<p></p>



<p>The syntax for binding to a XAML property is written as:</p>



<p> <code>{XojoBinding [name of class property]}</code></p>



<p>And in this case it&#8217;s binding the Caption property that we just added and exposed via the Inspector Behavior, to the Content of the XAML Button.</p>
</div></div>



<p>This means a change to the Caption property in the Inspector will now update the XAML code to reflect this change and update the layout accordingly. For doing more with the DesktopXAMLContainer, make sure to check out the Example Projects included in the Examples folder of the <a href="https://xojo.com/download/">Xojo Download</a>, the <a href="https://documentation.xojo.com/api/user_interface/desktop/desktopxamlcontainer.html">Xojo Documentation</a>.</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p class="has-text-align-center has-text-color has-link-color wp-elements-a0a2ac26ad214a49dac577734d259176" style="color:#84bd00"><a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Download Xojo</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
