<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Xiaoye Remote Blog</title>
        <link>https://xiaoyeapp.com/blog</link>
        <description>Xiaoye Remote Blog</description>
        <lastBuildDate>Wed, 23 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Recording an AOT Deadlock Issue in .NET]]></title>
            <link>https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes</link>
            <guid>https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes</guid>
            <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Tracing from a JSON parsing crash all the way to a ComWrappers lock contention in the .NET runtime]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-symptoms">1. Symptoms<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#1-symptoms" class="hash-link" aria-label="Direct link to 1. Symptoms" title="Direct link to 1. Symptoms" translate="no">​</a></h2>
<p>The project is WinUI 3 + Native AOT. Everything runs fine during debugging, but after publishing and launching, it works normally for a few seconds, then the UI thread randomly becomes unresponsive, stuck in a "fuzzy state" — not a crash and exit, but a freeze with no response.</p>
<p><img decoding="async" loading="lazy" alt="ScreenShot_2026-09-23_205333_236" src="https://xiaoyeapp.com/assets/images/ScreenShot_2026-09-23_205333_236-60f0f45c83eba25c64a971b04f3af8a8.png" width="647" height="399" class="img_ev3q"></p>
<!-- -->
<p>The strange part is:</p>
<ul>
<li class="">Runs fine in Debug mode</li>
<li class="">Runs fine in non-AOT publish</li>
<li class="">Removing the JSON parsing calls inside makes it not hang</li>
<li class="">Reducing the for loop count to only the first 100 records also makes it not hang</li>
</ul>
<p><img decoding="async" loading="lazy" alt="ScreenShot_2026-09-23_202850_261" src="https://xiaoyeapp.com/assets/images/ScreenShot_2026-09-23_202850_261-ae27dd463dc8d221e2e7aada79ed2afb.png" width="779" height="463" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-hypotheses">2. Hypotheses<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#2-hypotheses" class="hash-link" aria-label="Direct link to 2. Hypotheses" title="Direct link to 2. Hypotheses" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hypothesis-1-jsonelement-metadata-trimmed-under-aot">Hypothesis 1: JsonElement metadata trimmed under AOT<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#hypothesis-1-jsonelement-metadata-trimmed-under-aot" class="hash-link" aria-label="Direct link to Hypothesis 1: JsonElement metadata trimmed under AOT" title="Direct link to Hypothesis 1: JsonElement metadata trimmed under AOT" translate="no">​</a></h3>
<p>Initially suspected that <code>System.Text.Json</code>'s <code>JsonElement</code> dynamic access was missing metadata under Native AOT. But this was quickly disproven:</p>
<p>On the same <code>item</code>, <code>GetStringProperty</code> was called 8 times in a row, each involving <code>TryGetProperty</code> + <code>GetString</code> + string construction. If <code>JsonElement</code> had a metadata issue, the first <code>GetStringProperty</code> should have crashed.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hypothesis-2-double-value-type-returning-a-reference">Hypothesis 2: double value type returning a reference<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#hypothesis-2-double-value-type-returning-a-reference" class="hash-link" aria-label="Direct link to Hypothesis 2: double value type returning a reference" title="Direct link to Hypothesis 2: double value type returning a reference" translate="no">​</a></h3>
<p><code>TryGetDouble(out var value)</code> — <code>value</code> is a <code>double</code>, a pure value type, copied directly, not referencing <code>JsonDocument</code>'s internal buffer. Ruled out.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hypothesis-3-object-initializer-syntax">Hypothesis 3: Object initializer syntax<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#hypothesis-3-object-initializer-syntax" class="hash-link" aria-label="Direct link to Hypothesis 3: Object initializer syntax" title="Direct link to Hypothesis 3: Object initializer syntax" translate="no">​</a></h3>
<p>Splitting <code>new QuoteData { ... }</code> into <code>new</code> first and then assigning line by line still causes the hang, so assignment ordering is ruled out.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hypothesis-4-observableobjects-propertychanged">Hypothesis 4: ObservableObject's PropertyChanged<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#hypothesis-4-observableobjects-propertychanged" class="hash-link" aria-label="Direct link to Hypothesis 4: ObservableObject's PropertyChanged" title="Direct link to Hypothesis 4: ObservableObject's PropertyChanged" translate="no">​</a></h3>
<p><code>QuoteData</code> inherits from <code>ObservableObject</code>, but changing it to plain auto-properties still reproduces the issue. Event mechanism ruled out.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-key-information">3. Key Information<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#3-key-information" class="hash-link" aria-label="Direct link to 3. Key Information" title="Direct link to 3. Key Information" translate="no">​</a></h2>
<p>The observation that "it appears randomly after several seconds" is key. If the crash were data-level, it should trigger the moment that object is accessed. A delay of several seconds means:</p>
<ul>
<li class="">GC runs after a few seconds</li>
<li class="">It reclaims some memory or traverses some list</li>
<li class="">It hits an inconsistent state inside the runtime</li>
</ul>
<p>Based on the stack structure of the frozen process, a similar issue record was found in the official dotnet/runtime Issues.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/ScreenShot_2026-09-23_212050_773-acaea5763ddb47d7616aa183c2206cfd.png" width="1016" height="497" class="img_ev3q"></p>
<p><strong>dotnet/runtime #104582</strong>:</p>
<blockquote>
<p>"The collection being traversed entered a bad state — already-released entries remained in the list. This is the result of a missing lock on the removal operation, causing a race with the finalizer when it runs."</p>
</blockquote>
<p><strong>microsoft-ui-xaml #9928</strong>:</p>
<blockquote>
<p>"The app starts, seems quite smooth, until the UI thread completely freezes. The deadlock happens very randomly, sometimes after a few minutes, sometimes after just a few seconds, but always when GC is waiting for collection to complete."</p>
</blockquote>
<p>The complete chain of the problem:</p>
<ol>
<li class="">
<p>Your code creates <code>ProductInfo</code> / <code>QuoteData</code> objects</p>
</li>
<li class="">
<p>Under the WinUI 3 environment, these objects are projected by CsWinRT into native object wrappers</p>
</li>
<li class="">
<p>The wrappers are registered into the runtime's global tracker list</p>
</li>
<li class="">
<p>The UI thread <strong>adds</strong> entries to the list, while the GC finalizer thread <strong>removes</strong> entries from the list</p>
</li>
<li class="">
<p>The removal operation lacks lock protection; both threads operating simultaneously corrupts the list's internal pointers</p>
</li>
<li class="">
<p>A few seconds later, GC traverses the list again, reads the bad pointer → hang or access violation</p>
<p><img decoding="async" loading="lazy" alt="deadlock" src="https://xiaoyeapp.com/assets/images/deadlock-0e2e7530efb8dfea29a599d2c0edce5b.png" width="819" height="438" class="img_ev3q"></p>
</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="why-removing-a-certain-call-fixes-it">Why "removing a certain call" "fixes" it<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#why-removing-a-certain-call-fixes-it" class="hash-link" aria-label="Direct link to Why &quot;removing a certain call&quot; &quot;fixes&quot; it" title="Direct link to Why &quot;removing a certain call&quot; &quot;fixes&quot; it" translate="no">​</a></h3>
<p>In reality, this is not a fix — it lowers the trigger probability. Removing the <code>GetDoubleProperty</code> or <code>GetDateTimeProperty</code> call reduces the number of wrappers created during a single traversal. The frequency of add operations decreases, shrinking the probability window of colliding with the finalizer's "removal operation."</p>
<p>Likewise, taking only the first 100 records or batching are all the same logic: <strong>reducing the wrapper creation density during a single traversal, avoiding the lock contention window.</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-solution">4. Solution<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#4-solution" class="hash-link" aria-label="Direct link to 4. Solution" title="Direct link to 4. Solution" translate="no">​</a></h2>
<p>If you encounter a similar issue, while waiting for a runtime update, you can adopt batching to lower the trigger probability: split the large array into small batches, and after each batch, let the UI thread yield once, giving GC a chance to complete its traversal.</p>
<p>Of course, this only lowers the contention probability. A single yield takes milliseconds, depending on how busy the message queue is. The best approach, of course, is still to upgrade the .NET version.</p>
<p>This issue has been fixed and merged into the latest .NET. Friends encountering similar issues can simply upgrade their project's .NET version:</p>
<ul>
<li class="">Fix commit: <code>dotnet/runtime@d7948dc</code> — "Fixes hang in WinUI apps published to AOT (#104583)"</li>
<li class="">Currently merged into the .NET 9 branch; .NET 8 users should see the issue disappear after upgrading to the latest patch version</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-summary">5. Summary<a href="https://xiaoyeapp.com/blog/2026/09/23/dotnet-aot-deadlock-notes#5-summary" class="hash-link" aria-label="Direct link to 5. Summary" title="Direct link to 5. Summary" translate="no">​</a></h2>
<ul>
<li class="">In conclusion, this problem is <strong>not in your code</strong> — it's a ComWrappers lock contention under the .NET runtime AOT path</li>
<li class="">It's also unrelated to JSON parsing; it's related to the behavior of "creating a large number of objects"</li>
<li class="">If batching can work around it, it only lowers the probability</li>
<li class="">The root fix requires upgrading to a .NET runtime version that contains the fix</li>
</ul>
<p><strong>Reference Links</strong></p>
<ul>
<li class=""><a href="https://github.com/dotnet/runtime/issues/104582" target="_blank" rel="noopener noreferrer" class="">dotnet/runtime #104582</a></li>
<li class=""><a href="https://github.com/microsoft/microsoft-ui-xaml/issues/9928" target="_blank" rel="noopener noreferrer" class="">microsoft/microsoft-ui-xaml #9928</a></li>
<li class=""><a href="https://github.com/dotnet/runtime/commit/d7948dc" target="_blank" rel="noopener noreferrer" class="">dotnet/runtime fix commit d7948dc</a></li>
</ul>]]></content:encoded>
            <category>.NET</category>
        </item>
        <item>
            <title><![CDATA[DNS Interception and Custom IP Redirection Using WFP]]></title>
            <link>https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect</link>
            <guid>https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect</guid>
            <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When developing Windows networking solutions, there are times when you need to intercept DNS queries for a specific domain and return a custom IP address to achieve traffic steering, local debugging, or access control.]]></description>
            <content:encoded><![CDATA[<p>When developing Windows networking solutions, there are times when you need to intercept DNS queries for a specific domain and return a custom IP address to achieve traffic steering, local debugging, or access control.</p>
<p>This article uses the interception of DNS A-record queries for <code>www.abc.com</code> as an example to walk through how to intercept DNS requests at the transport layer via WFP (Windows Filtering Platform) and return a specified IP address (e.g., <code>192.168.1.100</code>). The focus is on the configuration flow and key decision points, supplemented by essential code snippets.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="overall-flow">Overall Flow<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#overall-flow" class="hash-link" aria-label="Direct link to Overall Flow" title="Direct link to Overall Flow" translate="no">​</a></h2>
<p>The entire solution consists of five steps:</p>
<ol>
<li class="">Register a Provider and SubLayer to establish your own "territory"</li>
<li class="">Register a Callout and bind callback functions</li>
<li class="">Add a filter to capture only UDP traffic on port 53</li>
<li class="">In the callback, parse the DNS request, match the target domain, construct a response, and inject it</li>
<li class="">On unload, clean up all resources in reverse order</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-1-229707128c73b38592c1a19323872287.png" width="773" height="274" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-create-provider-and-sublayer">Step 1: Create Provider and SubLayer<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-1-create-provider-and-sublayer" class="hash-link" aria-label="Direct link to Step 1: Create Provider and SubLayer" title="Direct link to Step 1: Create Provider and SubLayer" translate="no">​</a></h2>
<p>A <strong>Provider</strong> identifies who registered the rules, while a <strong>SubLayer</strong> manages priority ordering for filters under the same Provider. Both are prerequisites for registering Filters and Callouts.</p>
<p>When creating a SubLayer, the <code>weight</code> value directly determines the evaluation priority of our filters within the same layer. Setting it to a high value like <code>0x7FFF</code> ensures that our filter rules are evaluated <strong>before</strong> system default rules, preventing preemption by Windows Firewall or other third-party software.</p>
<p>Two APIs are called for this step: <code>FwpmProviderAdd</code> and <code>FwpmSubLayerAdd</code>.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-register-callout">Step 2: Register Callout<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-2-register-callout" class="hash-link" aria-label="Direct link to Step 2: Register Callout" title="Direct link to Step 2: Register Callout" translate="no">​</a></h2>
<p>A Callout is the "hook" that WFP provides for developers to inject custom logic.</p>
<p>Two things need to be done here:</p>
<ol>
<li class=""><strong>Kernel Registration</strong> (<code>FwpsCalloutRegister</code>): Binds the <code>classifyFn</code>, <code>notifyFn</code>, and <code>flowDeleteFn</code> callbacks to the Callout. <code>classifyFn</code> is the core handler invoked for every matching packet; <code>notifyFn</code> handles Callout lifecycle events; <code>flowDeleteFn</code> cleans up flow context.</li>
<li class=""><strong>Management Registration</strong> (<code>FwpmCalloutAdd</code>): Registers this Callout with the filtering engine's management layer and specifies the layer it attaches to. We choose <strong><code>FWPM_LAYER_OUTBOUND_TRANSPORT_V4</code></strong>.</li>
</ol>
<p><strong>Why the transport layer instead of the network layer?</strong> The network layer (IPPACKET) also exposes UDP ports, but it presents complete IP packets that may be fragmented, requiring the developer to handle reassembly themselves. The transport layer, by contrast, delivers already-reassembled UDP datagrams and can associate them with process information, offering richer filtering conditions and simpler implementation.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-add-filter-conditions">Step 3: Add Filter Conditions<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-3-add-filter-conditions" class="hash-link" aria-label="Direct link to Step 3: Add Filter Conditions" title="Direct link to Step 3: Add Filter Conditions" translate="no">​</a></h2>
<p>After registration, the Callout does not take effect automatically—it must be activated by adding a Filter.</p>
<p>A Filter consists of a set of <strong>Conditions</strong> and an <strong>Action</strong>. We need two conditions:</p>
<ul>
<li class="">Protocol must be UDP (<code>FWPM_CONDITION_IP_PROTOCOL == IPPROTO_UDP</code>)</li>
<li class="">Destination port must be 53 (<code>FWPM_CONDITION_IP_REMOTE_PORT == 53</code>)</li>
</ul>
<p>The action is set to <code>FWP_ACTION_CALLOUT_TERMINATING</code>, meaning: once both conditions match, terminate subsequent filter processing immediately and hand the packet over to our Callout. This ensures both performance and avoids conflicts with other filters.</p>
<p>This step calls <code>FwpmFilterAdd</code>.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-4-prepare-injection-resources">Step 4: Prepare Injection Resources<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-4-prepare-injection-resources" class="hash-link" aria-label="Direct link to Step 4: Prepare Injection Resources" title="Direct link to Step 4: Prepare Injection Resources" translate="no">​</a></h2>
<p>The forged DNS response must be re-injected back into the network stack, which requires two infrastructure components:</p>
<ol>
<li class=""><strong>NET_BUFFER_LIST Pool</strong> (<code>NdisAllocateNetBufferListPool</code>): Used to allocate memory structures that hold the forged packet. Pool-based allocation is more efficient than allocating from scratch every time, which is critical for performance-sensitive network processing.</li>
<li class=""><strong>Injection Handle</strong> (<code>FwpsInjectionHandleCreate</code>): Creates a transport-layer injection handle. We choose <code>FWPS_INJECTION_TYPE_TRANSPORT</code> because our forged packet is a constructed UDP datagram that needs to be injected from the transport layer. This handle is used when calling <code>FwpsInjectTransportReceiveAsync</code> for asynchronous injection.</li>
</ol>
<p>Both resources are prepared once during initialization to avoid repeated creation overhead per injection.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-5-what-happens-inside-the-callback">Step 5: What Happens Inside the Callback<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-5-what-happens-inside-the-callback" class="hash-link" aria-label="Direct link to Step 5: What Happens Inside the Callback" title="Direct link to Step 5: What Happens Inside the Callback" translate="no">​</a></h2>
<p>Once a DNS request hits the filter conditions, the <code>classifyFn</code> callback is invoked. Its function prototype is:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">typedef</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">NTAPI </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">FWPS_CALLOUT_CLASSIFY_FN2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _In_ </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> FWPS_INCOMING_VALUES0</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> nFixedValues</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _In_ </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> FWPS_INCOMING_METADATA_VALUES0</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inMetaValues</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _Inout_opt_ </span><span class="token keyword" style="color:#00009f">void</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> layerData</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _In_opt_ </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> classifyContext</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _In_ </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> FWPS_FILTER2</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> filter</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _In_ UINT64 flowContext</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _Inout_ FWPS_CLASSIFY_OUT0</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> classifyOut</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The processing flow is as follows:</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="51-extract-packet-information">5.1 Extract Packet Information<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#51-extract-packet-information" class="hash-link" aria-label="Direct link to 5.1 Extract Packet Information" title="Direct link to 5.1 Extract Packet Information" translate="no">​</a></h3>
<p>Retrieve remote address, local address, ports, interface index, and other fields from <code>inFixedValues</code>. For the <code>OUTBOUND_TRANSPORT_V4</code> layer, available fields include:</p>
<ul>
<li class=""><code>FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_ADDRESS</code>: Destination IP</li>
<li class=""><code>FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_ADDRESS</code>: Source IP</li>
<li class=""><code>FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_REMOTE_PORT</code>: Destination port</li>
<li class=""><code>FWPS_FIELD_OUTBOUND_TRANSPORT_V4_IP_LOCAL_PORT</code>: Source port</li>
<li class=""><code>FWPS_FIELD_OUTBOUND_TRANSPORT_V4_INTERFACE_INDEX</code>: Network interface index</li>
</ul>
<p>These are needed when constructing the response packet—particularly the interface index, which determines the NIC through which the packet is injected.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="52-extract-and-parse-the-dns-request">5.2 Extract and Parse the DNS Request<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#52-extract-and-parse-the-dns-request" class="hash-link" aria-label="Direct link to 5.2 Extract and Parse the DNS Request" title="Direct link to 5.2 Extract and Parse the DNS Request" translate="no">​</a></h3>
<p>Inside the <code>classifyFn</code> callback, <code>layerData</code> points to a <code>NET_BUFFER_LIST</code> structure. Using <code>NdisGetDataBuffer</code>, we extract the complete UDP datagram:</p>
<ul>
<li class="">UDP header is fixed at 8 bytes (source port 2 bytes + destination port 2 bytes + length 2 bytes + checksum 2 bytes)</li>
<li class="">The UDP header is immediately followed by the DNS message</li>
</ul>
<p><strong>DNS Query Format (QR=0) – <code>www.abc.com</code> A-record query:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">                                    1  1  1  1  1  1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                      ID                     |   Transaction ID (matches response)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |QR|   Opcode  |AA|TC|RD|RA| Z|AD|CD| RCODE   |   QR=0 indicates query</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QDCOUNT                    |   Question section count (=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    ANCOUNT                    |   Answer section count (=0)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    NSCOUNT                    |   Authority section count (=0)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    ARCOUNT                    |   Additional section count (=0)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                                               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                     QNAME                     /   Domain name (www.abc.com)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                                               /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QTYPE                      |   Query type (A=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QCLASS                     |   Query class (IN=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div></code></pre></div></div>
<p>The QNAME field is encoded with each label prefixed by a length byte, followed by the label content, and terminated by <code>0x00</code>. For example, <code>www.abc.com</code> is encoded as:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">03 77 77 77 03 61 62 63 03 63 6f 6d 00</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3  w  w  w  3  a  b  c  3  c  o  m end</span><br></div></code></pre></div></div>
<p>First, check the QR bit in the DNS header (the high bit of the third byte)—if it is <code>1</code>, this is a DNS response, so skip it; only queries with <code>QR=0</code> need to be processed.</p>
<p>Then parse the Question section to extract the queried domain name. For a domain like <code>www.abc.com</code>, use <code>RuleManagerMatch</code> to determine whether it matches the rule list.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="53-check-query-type-and-construct-response">5.3 Check Query Type and Construct Response<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#53-check-query-type-and-construct-response" class="hash-link" aria-label="Direct link to 5.3 Check Query Type and Construct Response" title="Direct link to 5.3 Check Query Type and Construct Response" translate="no">​</a></h3>
<p>Extract the <code>QTYPE</code> (query type) from the end of the Question section to determine whether it is an A-record (IPv4, <code>QTYPE=1</code>) or AAAA-record (IPv6, <code>QTYPE=28</code>).</p>
<p>Upon receiving an A-record query, construct a response containing <code>192.168.1.100</code>. The response is based on the original request with the following modifications:</p>
<p><strong>DNS Header Modifications:</strong></p>
<table><thead><tr><th>Field</th><th>Original</th><th>New</th><th>Description</th></tr></thead><tbody><tr><td>QR</td><td>0</td><td>1</td><td>Change to response</td></tr><tr><td>Opcode</td><td>0</td><td>0</td><td>Unchanged</td></tr><tr><td>AA</td><td>0</td><td>1</td><td>Set as authoritative answer</td></tr><tr><td>RCODE</td><td>0</td><td>0</td><td>No error</td></tr><tr><td>QDCOUNT</td><td>1</td><td>1</td><td>Retain original query</td></tr><tr><td>ANCOUNT</td><td>0</td><td>1</td><td>Add 1 answer record</td></tr></tbody></table>
<p><strong>DNS Response Format (QR=1) – <code>www.abc.com -&gt; 192.168.1.100</code>:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">                                    1  1  1  1  1  1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                      ID                     |   Same transaction ID as request</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |QR|   Opcode  |AA|TC|RD|RA| Z|AD|CD| RCODE   |   QR=1, AA=1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QDCOUNT                    |   Question count (=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    ANCOUNT                    |   Answer count (=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    NSCOUNT                    |   Authority count (=0)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    ARCOUNT                    |   Additional count (=0)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                                               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                     QNAME                     /   Echo back the query domain</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                                               /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QTYPE                      |   Echo back (A=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    QCLASS                     |   Echo back (IN=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                                               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                     NAME                      /   Answer section: echo domain</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    /                                               /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    TYPE                       |   Type (A=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    CLASS                      |   Class (IN=1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    TTL                        |   Time-to-live (e.g., 300s)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    RDLENGTH                   |   Data length (IPv4=4)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |                    RDATA                      |   192.168.1.100 (4 bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div></code></pre></div></div>
<p>The RDATA field holds the IP address. <code>192.168.1.100</code> in network byte order (big-endian) is written as <code>C0 A8 01 64</code>.</p>
<p>When constructing the response, you need to modify the DNS header of the original request: flip the QR bit, set response flags, and populate the Answer section. The UDP header must also be prepended before the data because the injection occurs from the transport layer.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="54-encapsulate-ip-header-and-inject">5.4 Encapsulate IP Header and Inject<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#54-encapsulate-ip-header-and-inject" class="hash-link" aria-label="Direct link to 5.4 Encapsulate IP Header and Inject" title="Direct link to 5.4 Encapsulate IP Header and Inject" translate="no">​</a></h3>
<p>The constructed DNS response also needs a UDP header prepended before it can be injected from the transport layer:</p>
<p><strong>UDP Header (8 bytes):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |            Source Port (DNS server=53)        |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |            Destination Port (client port)     |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |              UDP Length                       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |             UDP Checksum                      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    |              DNS Response (above)             |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></div></code></pre></div></div>
<p>Then, use <code>FwpsConstructIpHeaderForTransportPacket0</code> to encapsulate the IP header in front of the NBL:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FwpsConstructIpHeaderForTransportPacket0</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    pInjectNbl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// NBL containing UDP+DNS data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// headerIncludeHeaderLength</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    AF_INET</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">             </span><span class="token comment" style="color:#999988;font-style:italic">// IPv4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UCHAR</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">srcIp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Source IP (DNS server address)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UCHAR</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">dstIp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Destination IP (client address)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    IPPROTO_UDP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic">// Protocol type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// endpointHandle</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token constant" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// controlData</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// controlDataLength</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// flags</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token constant" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// reserved</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    interfaceIndex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// interface index</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    subInterfaceIndex    </span><span class="token comment" style="color:#999988;font-style:italic">// sub-interface index</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>After encapsulation, call <code>FwpsInjectTransportReceiveAsync</code> for asynchronous injection. The completion callback is responsible for freeing the NBL and the previously allocated DNS response data memory.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="55-block-the-original-packet">5.5 Block the Original Packet<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#55-block-the-original-packet" class="hash-link" aria-label="Direct link to 5.5 Block the Original Packet" title="Direct link to 5.5 Block the Original Packet" translate="no">​</a></h3>
<p>This final step is critical: you must set <code>classifyOut-&gt;actionType = FWP_ACTION_BLOCK</code> and set the <code>FWPS_CLASSIFY_OUT_FLAG_ABSORB</code> flag.</p>
<p>If the original packet is not blocked, the real DNS response will arrive later and conflict with the forged packet, causing the application to receive the wrong IP. With these flags set, WFP discards the original request, and only the forged response reaches the application layer.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-6-cleanup">Step 6: Cleanup<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#step-6-cleanup" class="hash-link" aria-label="Direct link to Step 6: Cleanup" title="Direct link to Step 6: Cleanup" translate="no">​</a></h2>
<p>When unloading the driver, the resource release order must strictly reverse the initialization order:</p>
<ol>
<li class="">Delete Filter (<code>FwpmFilterDeleteById</code>)</li>
<li class="">Delete user-mode Callout (<code>FwpmCalloutDeleteByKey</code>)</li>
<li class="">Unregister kernel Callout (<code>FwpsCalloutUnregisterByKey</code>)</li>
<li class="">Delete SubLayer (<code>FwpmSubLayerDeleteByKey</code>)</li>
<li class="">Delete Provider (<code>FwpmProviderDeleteByKey</code>)</li>
<li class="">Free NBL pool (<code>NdisFreeNetBufferListPool</code>)</li>
<li class="">Destroy injection handle (<code>FwpsInjectionHandleDestroy</code>)</li>
</ol>
<p>Failure at any step may cause resource leaks. Use status flags to track failures, but do not stop subsequent cleanup just because one step fails—doing so would worsen the leak.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="key-decision-points-summary">Key Decision Points Summary<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#key-decision-points-summary" class="hash-link" aria-label="Direct link to Key Decision Points Summary" title="Direct link to Key Decision Points Summary" translate="no">​</a></h2>
<table><thead><tr><th>Decision Point</th><th>Choice</th><th>Reason</th></tr></thead><tbody><tr><td>Filtering Layer</td><td><code>OUTBOUND_TRANSPORT_V4</code></td><td>Provides both port and UDP payload access, ideal for DNS filtering</td></tr><tr><td>SubLayer Weight</td><td><code>0x7FFF</code></td><td>High priority to ensure evaluation before system rules</td></tr><tr><td>Filter Action</td><td><code>CALLOUT_TERMINATING</code></td><td>Terminate further processing on hit, improving performance</td></tr><tr><td>Injection Type</td><td><code>TRANSPORT</code></td><td>Constructed UDP data fits naturally with transport-layer injection</td></tr><tr><td>Response Handling</td><td>Process A-record only</td><td>Simplified for demonstration; can be extended to AAAA and other record types</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="important-notes">Important Notes<a href="https://xiaoyeapp.com/blog/2026/08/23/wfp-domain-redirect#important-notes" class="hash-link" aria-label="Direct link to Important Notes" title="Direct link to Important Notes" translate="no">​</a></h2>
<ol>
<li class=""><strong>Asynchronous Injection</strong>: Injection uses async interfaces. You must properly implement the completion callback to free the NBL and response data; otherwise, memory leaks will occur.</li>
<li class=""><strong>MDL Lifecycle</strong>: MDLs allocated via <code>IoAllocateMdl</code> must be freed after injection completes. The timing for this is inside the completion callback.</li>
<li class=""><strong>NBL Ownership</strong>: After calling <code>FwpsInjectTransportReceiveAsync</code>, ownership of the NBL transfers to WFP—do not manually free it. However, the DNS response data (<code>completionContext</code>) must be freed by yourself in the completion callback.</li>
<li class=""><strong>Memory Allocation</strong>: Allocate DNS response data using <code>NonPagedPoolNx</code> rather than <code>NonPagedPool</code>. Two reasons: first, the <code>classifyFn</code> callback may execute at <code>DISPATCH_LEVEL</code>, where only non-paged memory can be accessed; second, <code>NonPagedPoolNx</code> adds an additional No-Execute (NX) marker, which is Microsoft's recommended security practice to prevent malicious code execution following buffer overflows.</li>
<li class=""><strong>UDP Only</strong>: TCP-based DNS requests (DoH, DoT) are not handled by this filtering logic and require additional layers.</li>
</ol>
<hr>
<ul>
<li class="">If you have needs related to Windows network filtering, traffic interception, or IP redirection, feel free to reach out for consultation and collaboration.</li>
</ul>]]></content:encoded>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[WFP: The Universal Power Strip for Windows Network Filtering]]></title>
            <link>https://xiaoyeapp.com/blog/2026/08/05/wfp-basic</link>
            <guid>https://xiaoyeapp.com/blog/2026/08/05/wfp-basic</guid>
            <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[If you're doing Windows network development—especially firewalls, VPNs, network monitoring, or similar tools—WFP (Windows Filtering Platform) is unavoidable. However, terms like drivers, kernel, and Callouts can be intimidating.]]></description>
            <content:encoded><![CDATA[<p>If you're doing Windows network development—especially firewalls, VPNs, network monitoring, or similar tools—WFP (Windows Filtering Platform) is unavoidable. However, terms like drivers, kernel, and Callouts can be intimidating.</p>
<p>This article won't dive into complex API details. Instead, it aims to explain, in the simplest terms possible, what WFP is, what it can do, and how it works internally.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-exactly-is-wfp">What Exactly is WFP?<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#what-exactly-is-wfp" class="hash-link" aria-label="Direct link to What Exactly is WFP?" title="Direct link to What Exactly is WFP?" translate="no">​</a></h2>
<p>In one sentence: <strong>WFP is a "universal power strip" embedded in the Windows kernel network stack.</strong></p>
<p>It provides "sockets" (filtering layers) at all key points where network data passes through. You can plug your own processing logic ("plugs") into these sockets to intercept, inspect, modify, and allow/block network traffic.</p>
<p>The built-in Windows Firewall itself is Microsoft's own "plug" inserted into these sockets. Antivirus software, parental controls, and traffic monitoring tools all leverage this same infrastructure.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-1-027dd3051a6af261bafec6929f2861e1.png" width="900" height="454" class="img_ev3q"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="why-use-wfp">Why Use WFP?<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#why-use-wfp" class="hash-link" aria-label="Direct link to Why Use WFP?" title="Direct link to Why Use WFP?" translate="no">​</a></h2>
<p>Before WFP, developers had several legacy approaches for network filtering: TDI filters, NDIS intermediate drivers, Winsock LSPs, and others. Each had its own limitations:</p>
<ul>
<li class="">Some could only intercept traffic at specific points, without end-to-end control.</li>
<li class="">Some lacked compatibility with newer protocols like IPv6.</li>
<li class="">Some frequently broke with OS updates.</li>
</ul>
<p><strong>WFP's greatest value is unifying and standardizing network filtering on Windows.</strong> Starting with Windows Vista/Server 2008, it became the foundation for modern firewall and network processing solutions.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="the-big-four-components-of-wfp">The "Big Four" Components of WFP<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#the-big-four-components-of-wfp" class="hash-link" aria-label="Direct link to The &quot;Big Four&quot; Components of WFP" title="Direct link to The &quot;Big Four&quot; Components of WFP" translate="no">​</a></h2>
<p>The WFP architecture can be understood as four roles working together:</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="605" height="371" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-shims-the-on-site-intelligence-officers">1. Shims: The "On-site Intelligence Officers"<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#1-shims-the-on-site-intelligence-officers" class="hash-link" aria-label="Direct link to 1. Shims: The &quot;On-site Intelligence Officers&quot;" title="Direct link to 1. Shims: The &quot;On-site Intelligence Officers&quot;" translate="no">​</a></h3>
<p>These are kernel-mode modules embedded at various layers of the TCP/IP stack. They intercept passing traffic, package it into a format WFP understands, and forward it to the filter engine for classification.</p>
<p>Different shims handle traffic at different layers—ALE shims handle application connections, transport-layer shims handle transport data, network-layer shims handle network packets, and so on. You don't need to write shims yourself; they're built into the WFP framework.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-filter-engine-the-core-referee">2. Filter Engine: The Core "Referee"<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#2-filter-engine-the-core-referee" class="hash-link" aria-label="Direct link to 2. Filter Engine: The Core &quot;Referee&quot;" title="Direct link to 2. Filter Engine: The Core &quot;Referee&quot;" translate="no">​</a></h3>
<p>This is the heart that does the actual work. It spans both kernel-mode and user-mode, with approximately <strong>50 kernel-mode layers and 10 user-mode layers</strong>. Data passes through different layers at different stages of its journey through the network stack.</p>
<p>Each layer contains <strong>sub-layers</strong> and <strong>filters</strong>. A filter is essentially a rule, such as "allow traffic if the destination port is 80." When traffic arrives, the filter engine evaluates rules in priority order and renders a verdict: "allow" or "block."</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-base-filtering-engine-bfe-the-behind-the-scenes-dispatcher">3. Base Filtering Engine (BFE): The Behind-the-Scenes "Dispatcher"<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#3-base-filtering-engine-bfe-the-behind-the-scenes-dispatcher" class="hash-link" aria-label="Direct link to 3. Base Filtering Engine (BFE): The Behind-the-Scenes &quot;Dispatcher&quot;" title="Direct link to 3. Base Filtering Engine (BFE): The Behind-the-Scenes &quot;Dispatcher&quot;" translate="no">​</a></h3>
<p>BFE is a user-mode system service (the <code>Base Filtering Engine</code>) and serves as the management and control center for WFP.</p>
<p>Its primary responsibilities include:</p>
<ul>
<li class="">Accepting commands from upper-layer applications (like firewall management UIs) to add or remove filters.</li>
<li class="">Arbitrating policies from multiple sources when conflicts arise.</li>
<li class="">Maintaining WFP's operational state and statistics.</li>
<li class="">Distributing IPsec and other policy configurations to the appropriate system modules.</li>
</ul>
<p>In short, <strong>BFE issues the commands, and the filter engine executes them.</strong></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-callouts-the-custom-hooks-for-developers">4. Callouts: The "Custom Hooks" for Developers<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#4-callouts-the-custom-hooks-for-developers" class="hash-link" aria-label="Direct link to 4. Callouts: The &quot;Custom Hooks&quot; for Developers" title="Direct link to 4. Callouts: The &quot;Custom Hooks&quot; for Developers" translate="no">​</a></h3>
<p>This is where WFP's extensibility shines. The built-in "allow/block" logic not flexible enough? You can write your own <strong>Callout Driver</strong> to register one or more callback functions (Callouts).</p>
<p>You can attach a Callout to any kernel-mode layer. When a packet matches a filter that uses your Callout, your <code>classifyFn</code> function is invoked. Inside it, you can implement advanced logic such as:</p>
<ul>
<li class=""><strong>Deep Packet Inspection:</strong> Scan packet payloads for malware signatures.</li>
<li class=""><strong>Packet Modification:</strong> Perform NAT, rewriting IP addresses and ports.</li>
<li class=""><strong>Stream Modification:</strong> Replace or remove sensitive words in data streams (e.g., parental controls).</li>
<li class=""><strong>Logging:</strong> Record all blocked or matched traffic.</li>
</ul>
<p>With Callouts, WFP transforms from a simple "switch" into a deeply programmable network processing platform.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="how-is-wfp-layered">How is WFP Layered?<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#how-is-wfp-layered" class="hash-link" aria-label="Direct link to How is WFP Layered?" title="Direct link to How is WFP Layered?" translate="no">​</a></h2>
<p>WFP's layers correspond directly to the TCP/IP protocol stack, with filtering points available from application-layer data all the way down to raw packets leaving the NIC. Here's a brief walkthrough using an <strong>outbound TCP packet</strong> as an example:</p>
<ol>
<li class=""><strong>Application Layer (ALE Layer):</strong> The app calls <code>send()</code>, and the data enters the kernel. The <code>ALE_AUTH_CONNECT</code> layer is triggered—this is the "connection authorization" stage, where you can obtain process PID, image path, destination IP/port, and other info. <strong>This is the most critical layer for building application-aware firewalls.</strong></li>
<li class=""><strong>Transport Layer (TRANSPORT Layer):</strong> The TCP packet has been constructed but not yet fragmented. At <code>OUTBOUND_TRANSPORT_V4</code>, you can access the complete TCP header and payload data.</li>
<li class=""><strong>Network Layer (IPPACKET Layer):</strong> The IP packet has been encapsulated and may be fragmented. At <code>OUTBOUND_IPPACKET_V4</code>, you can access the IP header. <strong>Process information is no longer available at this layer,</strong> making it suitable for IP-level filtering and VPN tunnel encapsulation.</li>
</ol>
<p>For inbound traffic, the order is reversed: <code>INBOUND_IPPACKET_V4</code> → <code>INBOUND_TRANSPORT_V4</code> → <code>ALE_AUTH_RECV_ACCEPT</code>, flowing upward.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="how-to-choose-the-right-layer">How to Choose the Right Layer?<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#how-to-choose-the-right-layer" class="hash-link" aria-label="Direct link to How to Choose the Right Layer?" title="Direct link to How to Choose the Right Layer?" translate="no">​</a></h2>
<p>Different development goals require different layers. The following table summarizes common use cases and their recommended layers:</p>
<table><thead><tr><th>What You Want to Do</th><th>Recommended Layer</th><th>Reason</th></tr></thead><tbody><tr><td>Block a specific application from accessing the network; per-process control</td><td><code>ALE_AUTH_CONNECT</code> / <code>ALE_AUTH_RECV_ACCEPT</code></td><td>Provides full process information and only processes the first packet of a connection, offering good performance.</td></tr><tr><td>Analyze HTTP requests; detect SQL injection</td><td><code>STREAM</code> layer (TCP-specific)</td><td>Data is reassembled from TCP segments, providing a continuous application-layer data stream for easy parsing.</td></tr><tr><td>Analyze DNS packets (UDP)</td><td><code>DATAGRAM</code> layer (UDP-specific)</td><td>Provides the complete UDP datagram, ideal for DNS filtering.</td></tr><tr><td>IP-level firewall; VPN tunnels</td><td><code>IPPACKET</code> layer</td><td>Offers the lowest-level interception, though it sacrifices process and port information.</td></tr></tbody></table>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="summary">Summary<a href="https://xiaoyeapp.com/blog/2026/08/05/wfp-basic#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>WFP is the "right path" for network filtering on Windows. It exposes critical points in the network stack, allowing you to intercept and process traffic in a standardized way.</p>
<p>While writing a Callout driver still requires working through the WDK documentation, understanding WFP's "power strip" model makes the core concepts clear: <strong>data travels through the stack, passes through a series of "sockets" (layers), and your "plugs" (Callouts) execute logic there, telling the system whether to allow, block, or modify each packet.</strong></p>]]></content:encoded>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[Two Directly Connected PCs Can Communicate Across Subnets]]></title>
            <link>https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets</link>
            <guid>https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets</guid>
            <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Hey network engineers, sysadmins, and anyone driven crazy by VLANs – hold up!]]></description>
            <content:encoded><![CDATA[<p>Hey network engineers, sysadmins, and anyone driven crazy by VLANs – hold up!</p>
<p>Today we're talking about a trick that goes against common sense. You've probably always thought: if you connect two PCs directly with a cable, they <strong>have to be on the same subnet</strong> to talk to each other (like 192.168.1.x and 192.168.1.y).</p>
<p>Yeah, that's the "politically correct" way. But sometimes life throws you curveballs:</p>
<ul>
<li class="">Maybe one PC has a <strong>static IP</strong> (10.10.10.5) and the other is <strong>DHCP</strong> (192.168.1.3), and you just don't want to keep changing them back and forth.</li>
<li class="">Maybe you're just <strong>testing</strong> Layer 3 forwarding and don't want to set up a complicated router.</li>
<li class="">Or maybe you just want to <strong>prove the old-timers wrong</strong> who insist "they must be on the same subnet!"</li>
</ul>
<p>Today, I'm going to show you how to break that rule. <strong>Two directly connected PCs with IPs on different subnets? Still pingable!</strong> And you don't need an extra router – just the built-in "soft router" feature in Windows.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/1-6423251f9b9809546f226b1349d7aa73.png" width="956" height="390" class="img_ev3q"></p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-the-hardware-if-you-mess-this-up-just-quit-networking">Step 1: The Hardware (If you mess this up, just quit networking)<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#step-1-the-hardware-if-you-mess-this-up-just-quit-networking" class="hash-link" aria-label="Direct link to Step 1: The Hardware (If you mess this up, just quit networking)" title="Direct link to Step 1: The Hardware (If you mess this up, just quit networking)" translate="no">​</a></h2>
<p>A crossover cable? <strong>Wrong!</strong> That was the rule back in the ancient times (circa 2000).</p>
<p>Just grab a <strong>regular straight-through cable</strong>, plug one end into PC-A's NIC, and the other into PC-B's NIC. Once plugged in, you'll see the little LEDs on the ports start "bling bling" – that means the physical link is ready.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-set-up-their-id-cards-ip-addresses">Step 2: Set Up Their "ID Cards" (IP Addresses)<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#step-2-set-up-their-id-cards-ip-addresses" class="hash-link" aria-label="Direct link to Step 2: Set Up Their &quot;ID Cards&quot; (IP Addresses)" title="Direct link to Step 2: Set Up Their &quot;ID Cards&quot; (IP Addresses)" translate="no">​</a></h2>
<p>Let's put them in two different "camps":</p>
<ul>
<li class=""><strong>PC-A:</strong> IP <code>192.168.1.3</code>, Subnet Mask <code>255.255.255.0</code></li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/2-64f99103119fa2d1eab515cf38c728f5.png" width="532" height="240" class="img_ev3q"></p>
<ul>
<li class=""><strong>PC-B:</strong> IP <code>10.10.10.5</code>, Subnet Mask <code>255.255.255.0</code></li>
</ul>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbAAAADlCAIAAAC9GDWNAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAEpBJREFUeJzt3T2IHscdx/E5ML7GdnM5c1EqgUWEHYIhL4WTYm2Cg+UihkAEJpCQwi5SSDGkOEgXgwuDLYWEYFUpTECpksIWGBNtYxWphImJsQyqbI5c1JwcwrlRnpe/9uaZt53Z13n2+X4K6Xn2mZ1ndp/d383MPi8P7P32Xwf/VQCABxQAYIFABABBIAKAIBABQBCIACAIRAAQoUB881SZVNevPi8UAKytmh7iD374nO+hP/zpb7/8+Y+qf7/+1QcVAKyzmkD83907vod+8ePvzx6t/v3gxj88BbcvvXL6wu7i5uGd771xeEPl45F3X9v55PLtiwf6klP3/wgcX155CMDE1QTid7/9rciK3vzdHx1L93ZvXdi5dfXjrZty99KT6sZNlTfJwaeePf3Bi7t/6THB7TgGMKZeL6psX3pxnobnqgQ8OFyjk//Ge3euPb3zk73DG+vTZgBtRAXivXv3Zv9ubW3pS/S7bnuPPL9793Vnf3DRc3xscfOaJOaiu3T1i+fPz5fPFr766OkPnt6ePfDp9dtn3juOKKBe+unZt55YVPrR51tvH8kq17+88PTDerHq2T+9fudWzPYv6lEfqeee+PLl/c+utG78YuH2cmz+3IWzF6S1AEZWH4hV9i1vREVh5fDLfzqWPvLuYhx95uYym05fOlgOG7cvPPPF9/Y/vvHk1+6dP3vm+u2t/WM1v/2Vl9777IqqL3Dl7Y+vLOt/befS3pHU+eidrf3PtGInzz4fFCv1iaftTz2789zhF69K93D7zL9vb7193EHj52uduvTh7XP7iiEzkJWEIfMyB6s0jErG3Qe/MRt7Ggv3ts+o+z3Hg8PXP9p5YW92Q80n7/68mLC7effa+Qc/+XDRm5vf3nk8ssA8gB5e1Ht8P+aOL79/tFJsFm2Hd362ePbloNhq9PaFWa9tfuPuy/vVBOLxO8una9/4lbUAZCQhEPUe4vJGzQoHR+8cnn7hSXVlmKsos57XefXy/qyTuH3plVMtKur74vL2448qABmqD8Qq+4we4pI9vag5vvj3u7Px47vq/nWVvd1Le4cXbx7fUjsSlHu7v37i7utvqw7sPfjYcoQ+n7tU7/iKHRzf2j31mycPz91cDIr9Q2bv6g0bv/38N7cvHhyHplYBjCqqh+jMO2c+mm5+tnWwe+vC2XvnF3fn70Oc/Xd07vL2/YXz7tgV1YWb/7n8zOkPXttRh3evHQbKHZ27+vAspmfP/un1O9fUQ4lP07jxx7cePXXvtfmVlmtXl3OdR3/96NRbXFQBstH/Z5kPDs/sH0YsPDq3fxS8XVvg+OIbH1+MqXMW01UH7b1AMzwLmzR+7pP3b59b7U7evwoEIAs1geh+uzUATFEoEPmyBgAbha//GoZzJA4gLwQiAAgCEQAEgQgAgkAEAEEgAoAgEAFAEIgAIOaB+NDvv6MAYOPRQwQAQSACgCAQAUAQiAAgCEQAEAQiAAgCEQAEgQgAgkAEAEEgAoAgEAFAEIgAIAhEABAEIgAIAhEABIEIAIJABADRMBDLsiyKQmUjt/YAWEcngTjLFP2BcL7MHrUzqKphudy426sG7VneHSVG28d3oIYRt8spt/YAARKIxglmhGMkI5WcITWk3NrToWy3hfjDWpv4HKIeHEaCjHvSto8zXyaOuF3OXU04Yo3MA9E+r5xjT7tMVp2UoliPDuCykc364IZsN7nI/lUAnIbrIfrmKPXl9mSfPRGZNNepV+KcE7BX9z0Ubmfgbm0jq+YZ7fQt1xmZ6Gx8bT2BtewtCr8ozk0IP6mvADC8qEBsf7D65ijt5cXC8rY+BAvXk8rOLLt+3229nb45Smd5owHVwuVte13fcntb9FWUK2sC9Tg3M7C9zvK+FqbuZ2BcrXqIRdMhW+QqetbE1FO0HkLaXZva8rWBZXNW7gzWwHK9tpjnjQnupHqA6RloyFyszpoZvY9O6vFJDazSGhg241zd6Bmp1ta0e1W4xt3A6OaBaHc94k+z+E6Zr/7U8yHczpadxAbrFp65udp62vdny7UdbJYMk5ElRw/RPlhL/6R+pPjeWbhY6olkJG/LUW1jMc9bO8fX+I9WoJ7CuiYzTE416OkDA5BA7GoIEzk0Nk5IY3npuWQZqMdpWVIPguqu7yn07l65UGjXNwLP6+yoOrfL2R4V7Gnay33JFdh1tfWruNclaX8GlrcJd6AnJz3EwBEZPlgLz0WAyBpqwyW+JUZ77DM/6SkCq8eICc3aVdqXbLxWUvubtQfIzcQ/qdK39pMJyup51S7vqv4RFQyZkaVuAjG3A3qw9nTyRH13r4os46YgBJEfeogAIAhEABAEIgAIAhEABIEIAIJABABBIAKAIBABQBCIACAIRAAQBCIACAIRAASBCACCQAQAQSACgCAQAUAQiAAgCEQAEPNA1H9nzv5ttk5+NqRv+g90KOvX+4zlDarqUG77s1yH1xcYxskP1etLOzk9hjzTqgQ0fgou9ecu7fItG0bcAGukfsjc+GS2c3bTlJ7fhh+9PTrCGqgwh3jCzotp/+4dAENNIFZdPHsgqXcAY4aZ9u/wGvUY05d9z+Wlqm2/siZelTVkdu4xu35l7Q3f0wWe2vmiNGtP7fYC01ATiL5sKhf088o5i6efh865vOpf42TrcC6vkx9Ed7Y/sB+ce0N59qdRUq/EaLzxB0Pf7YF6WrYnZnuBaTgJxFK7xByj/ZlQRF/0aPNcfZ+xIyaCkXfK1fXr70mB6ZFAHHccZJ+9dudITVqH+98e2AKIlMtFFbu3GNNz7LsNgw0Ju3oixrBAGz0GYkwPxc6gat3RT+wh2xDTI07q8YULl+Qm4BJ7ldmYzlerF1LU6rz7chV9Dr7BEDipfEw7Y/iGrs72B/aDsz2+dtqNLF3XVar9aWy1s532BRDj0XB7UrdXAZNwEojVGag/7DzWw2V8w17faaOfhLWFfWLa2aYq5/LIDW/ZpNTd4tyfvhoCFSZtLzANucwhbrhiwy4iAXkiEHNBCAKjIxABQBCIACAIRAAQBCIACAIRAASBCACCQAQAQSACgCAQAUAQiAAgCEQAEAQiAAgCEQAEgQgAgkAEAEEgAoAgEAFAEIgAIAhEABAEIgAIAhEABIEIAIJABABBIAKAIBABQBCIACAIRAAQBCIACAIRAASBCACCQAQAQSACgCAQAUAQiAAg5oFYlqWxtCgKhbFN+3XRt67geEMe5oE4OxxnR6d+UBp3DctDeTIHcbabM+HXJWm7gMGYQ+bloWkcncbxujxR1Xi6PX/ab84A5/MGvi7A8JhDxAjCuVlOawiCNXISiM7ORbXQeYxWjxrDn+r2crlezL5tLAzUU9seJ2flyrO9zvJGO52NDDyk6vZDZPudC9f3ddErJPuQiZNANE4SY6F9yOoLq9vOuaHqIb2Yun/KxdcTbo+Ts3Jn/YEyRjv1Mr72JO2HsEm+LtXqypWe5CPG0nzI3OCoNXKkcT0NnjEmesLl9ca37NQ490NX1uJ10Z+CHiLyYQZi+0MzMnoGrqeIvuCQWj5cT1em97pU2v+BAbri7iG2OUC7OrI7qafBIC6r9hs29nUBhpE2ZB4rX3z1JE0mJj1kL/TNo3XbzmbW93XxVauYScQYTj6pUrquHlZ39WO0Km/fNUaaegFlHeip9fjaE1CsXjPVLwJU9esP+cqHn9R+KGk/+GzC6+KsBxiLfFKltpxexj4NAncD9afWE/+os2Sgfuft+A2JLJx62m/I69KmEqBbvDG7ntFjAjBVBGI9chDYEAQiAAgCEQAEgQgAgkAEAEEgAoAgEAFAEIgAIAhEABAEIgAIAhEABIEIAIJABABBIAKAIBABQBCIACAIRAAQBCIACAIRAET3gWj8gGe237+/7r91mdr+9tvre2WdP9pXLUk9Hvo+ftb9dUevOg5E45eYjIMbg+njtF/+dqgefIX2m67G3SoNk46HxsePb3uJPyTZiCGz8wfz1v0kCbTfmUedb6+RjyMK5O8A+wFT0mUg2qcHB9+4htz/MfnYxy9Tx5TP/DikG5uP4XqI+vBHn11ankgxy3312A/Z81nhea5m7Qyz58KMenyNVynb5SsZv721j7aR2ot0lndui/7SKP/2Ru4HfTnxtMkGCkTnWKZYnXuqXe6rJ3DbuZayTqdm7XTW4GunsubafI1P2q6YZw+UDzcjlTPOUiPGLl9of4qMu7XbG7kfjJYPnIaEbz7Gn0P0HQ1JR4lx6PdxhDnrjD/J7dtFRO+p7+0aYL8pfzx1Vb4TBX1DqDW8qOLs5uTG7tTUrrIW29VG0cXwGehVl4FoH8F9HNDrcoak7odiEme+8Zcg9QAgATGuHnuIAxzc+pxazFzYYOdb4Il886HOMpHb1Vib+scKr5660jGvS0wlKv1vG0P1fHQciIXnUqxzCLlcoh+ISjvc7eXFgm8oWvivAtvTQ6XnKmRSO8NHcG07a/dPYLt87U9droL7zblFvsYYIW6sFVN/oLzRyHJBX9hyPxjLSzqqm6r7HqLvSLKX27EVs2LgSI1/KKmS+HUjyzgfbdOkxstjHm1QuR5kKkXkTqitv/HyljnYbHXCNx/rd1FlfdH7ADJHIA6HHAQyRyACgCAQAUB0//Vf+l39sqy9PL7OyPJMz2FDOA/1Bm/fyaSelhHRoe7fdqNcHwgzliRlXFdt8708DV5+YCy+M6JMfB9lbvVkcgJObcgc2PvF6vvjapcDGXKOuvTDvoj7yGNu9WQi60A03nzbYWEgH4xR8jFmIBqfPahuV492cogEuvSp7alKGsN/vRJnecXhDgTZZ9woxvyCWL0v3VW/ugh+OFf/hJa9vOr869MfvvLO+ZFw/YATfyxVDz2hZoYLxPYXrWLWUl3Qpz+arRi5HIByfbh+rFNm5DnEauPtXaCnW+0ki9ErVD2IuSBjTCTbywHkLNOLKs7xafy6ffyFien9GRfXnMsBGPI5QcYPxMF6yPFXV2Kqcs4h2gWczxW/sZSfdvk2a+n0k8geLcXXnEM9k5pD1K8qqNX3KDXYTmdtvmLGlZDS+v7EQvsePedyo0J7XkO/azcycjnQhu+kqA7RyIMtq3oK1/s6RtHLJ1ViFsYUiNw1RrHA3Zjbkc8SXrHlFlF+Q8o3WCtQ2H4oqXC29Qxp/CEzAGSCQAQAQSACgCAQAUB0H4jGu1gymSvVGdeXq9sKyJ7z3Qv2W8f0d1zYyydcv4p7c49P92+78b31xFlYjZFEhfWlOM3aMFb7sbFKz2fqVUdvbFj3+vU6m72fccwhc9H1t3UN/JbOgm8bA3JiJGyDQOg3EOk9AbUYauSj+zdm26lsvN72y+8r4JzgC89BtD+2fLOK4VE2c5EYQODoqj1uY47Mda+/ve57iIX1kZ3C+tybftce8xfaZ+x8ZYzlbWYNdM4ndT6vvS5RiGYaT2HrK/qOVd/yydffTC9D5qR48o35+974QvvmMbsx4clB+48YaYgh+VJDrZ5HvuWTr7+xHucQe9qAvq9j2AN2593B2gMY+s6Fda+/jX7fdtOHsV4qIwSNnmxJJxGDcB5pvsOvwWG57vW3NMLbbowulW9+MLKqnvajr5E+kd3hMvGaD+WnXT51LeMYaxwuvmdc9/r107BZCPT7SRW9G1VqV4vKhUK7hKIXLuO+31BZe6SI+wq20hrkOhujN9K5XXrDjDYDPSldUzSF5y0ZvuUTrj8yBHyG+D5E+yE9KJUr1+Lvxjcg9dmdDfY9V/yrpVJQftrlU9eKPL9qlycVXqP6Yx4N48sdAEAQiAAgCEQAEAQiAIguA9G4fjT89dZOLvIGrmIDmLYuA7FYfS9eUjy1uVKuPNfym9Wjt18B2CRZfHSv5Xsp1eobAwP194S3HwLTkNcc4rixYuQaGYdhtBweoUPDBaJzbq5aaB8T9jvUnR9oCR9GgfpTOd8xH9N+tdqBLVY/DKOs7q29c3wFAHRroEAsPZ9h9I2UnXORRfAbaJxajsTD7Ylsv7K2187EwPbqz8XYfJJ4TfOR15C5MvqVDaM71kl77EQzgtKuv2j9YXUA8cYZMseXj+kG9sEZXkntCRRzPjTu9gJQQwZiUu9mlN5QYEzaoD3h8kX0W5SKdt/eASBej4EYOMnj8yW1n9W4SfE1NKjfNy2YWn9k8+K3kfLjlm+zFvrQ/SdVjNm36rZxPURfRVnHROH5XsJi9fvRqod89di1hTehqPteNqM9vvp921v7vM76FWcLMIiOP6mS+mhgFT1cfKv4yqS2LaZk+Lnshan1xG9LQOq6lB+3fJu10IdMrzJjicEUMCQCMWtEITAkAhEABIEIAIJABABBIAKAIBABQBCIACAIRAAQ/wd0lGfEe/hk4AAAAABJRU5ErkJggg==" width="432" height="229" class="img_ev3q"></p>
<p><strong>Notice that?</strong> One is on the 192.168.1.x network, the other on 10.10.10.x. If you do things the normal way and ping 10.10.10.5 from PC-A, the system will tell you: <strong>"Destination Host Unreachable"</strong> – because the OS thinks these two don't know each other.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="418" height="163" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-grant-god-mode-to-your-pcs-add-static-routes">Step 3: Grant "God Mode" to Your PCs (Add Static Routes)<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#step-3-grant-god-mode-to-your-pcs-add-static-routes" class="hash-link" aria-label="Direct link to Step 3: Grant &quot;God Mode&quot; to Your PCs (Add Static Routes)" title="Direct link to Step 3: Grant &quot;God Mode&quot; to Your PCs (Add Static Routes)" translate="no">​</a></h2>
<p>Since A and B don't know each other, we'll forcefully draw a map in their brains – telling them: when you're looking for the other guy, just go <strong>directly</strong> through your own NIC, don't bother asking the gateway!</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="on-pc-a-19216813">On PC-A (192.168.1.3):<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#on-pc-a-19216813" class="hash-link" aria-label="Direct link to On PC-A (192.168.1.3):" title="Direct link to On PC-A (192.168.1.3):" translate="no">​</a></h3>
<p>Open Command Prompt (CMD) and type this "spell":</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">route add 10.10.10.0 mask 255.255.255.0 192.168.1.3</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="596" height="93" class="img_ev3q"></p>
<p><strong>Translation:</strong> "Hey PC-A, anytime you're looking for someone on 10.10.10.x, don't ask anyone else – <strong>you're the guide!</strong> Just send it straight out of your own NIC!"</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="on-pc-b-1010105">On PC-B (10.10.10.5):<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#on-pc-b-1010105" class="hash-link" aria-label="Direct link to On PC-B (10.10.10.5):" title="Direct link to On PC-B (10.10.10.5):" translate="no">​</a></h3>
<p>Open CMD and type the "reply":</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">route add 192.168.1.0 mask 255.255.255.0 10.10.10.5</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="591" height="90" class="img_ev3q"></p>
<p><strong>Translation:</strong> "Hey PC-B, when you're looking for someone on 192.168.1.x, don't be shy – <strong>just fire it straight out of your NIC!</strong> "</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-4-witness-the-miracle-and-make-it-permanent">Step 4: Witness the Miracle (And Make It Permanent)<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#step-4-witness-the-miracle-and-make-it-permanent" class="hash-link" aria-label="Direct link to Step 4: Witness the Miracle (And Make It Permanent)" title="Direct link to Step 4: Witness the Miracle (And Make It Permanent)" translate="no">​</a></h2>
<p>Now, ping B from A:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ping 10.10.10.5</span><br></div></code></pre></div></div>
<p><strong>Boom!</strong> You'll see <code>Reply from 10.10.10.5: bytes=32 time&lt;1ms TTL=128</code>.</p>
<p>It works! Perfectly! Now you can <strong>share folders, transfer large files, or even play LAN games</strong> – no issues at all.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/7-e28b0ea355277d03f452ffc254392f24.png" width="463" height="443" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="️-pro-tips-survival-guide">⚠️ Pro Tips (Survival Guide)<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#%EF%B8%8F-pro-tips-survival-guide" class="hash-link" aria-label="Direct link to ⚠️ Pro Tips (Survival Guide)" title="Direct link to ⚠️ Pro Tips (Survival Guide)" translate="no">​</a></h2>
<ol>
<li class=""><strong>Reboot = Gone:</strong> The <code>route add</code> commands above are <strong>temporary</strong>. They'll vanish after a restart. To make them permanent, use <code>route -p add</code> (Windows) instead.</li>
<li class=""><strong>Turn off the firewall! Turn off the firewall! Turn off the firewall!</strong> I can't stress this enough. Windows Firewall, by default, allows ICMP (ping) from the same subnet but <strong>blocks it from different subnets</strong>. If you don't disable it, all your hard work will just give you "Request Timed Out." Just turn off Domain and Private firewalls for testing.</li>
<li class=""><strong>Subnet Mask Matters:</strong> Use <code>255.255.255.0</code> if you want the <strong>entire subnet</strong> to route through. Use <code>255.255.255.255</code> if you only want <strong>that specific host</strong> to communicate (host route) – precision targeting!</li>
</ol>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="final-thoughts">Final Thoughts<a href="https://xiaoyeapp.com/blog/2026/07/23/pcs-across-subnets#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts" translate="no">​</a></h2>
<p>See? Feels like a whole new world has opened up, doesn't it?</p>
<p>This trick is super handy for <strong>server migration temporary setups</strong>, <strong>team networks without a switch</strong>, or just <strong>showing off your skills</strong>.</p>
<p><strong>Remember:</strong> Technology is rigid, but people are flexible. Who says directly connected PCs have to be on the same subnet? As long as the routes are correct, you can ping across any distance!</p>
<p>Alright, I'm off to go mess with the product manager's head with this. Go try it out and report back!</p>
<p><strong>If it doesn't work, double-check the IPs in Step 3, or see if Windows Update secretly turned the firewall back on.</strong> Peace out! 👋</p>]]></content:encoded>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[Basic Usage of WireGuard on Windows]]></title>
            <link>https://xiaoyeapp.com/blog/2026/07/07/wireguard-windows</link>
            <guid>https://xiaoyeapp.com/blog/2026/07/07/wireguard-windows</guid>
            <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[WireGuard is known for its simplicity, efficiency, and security, and the official Windows client continues this tradition. Unlike the command-line operations on Linux, the Windows version focuses more on graphical management and tunnel switching. The configuration logic mainly revolves around generating key pairs and editing .conf files.]]></description>
            <content:encoded><![CDATA[<p><strong>WireGuard</strong> is known for its simplicity, efficiency, and security, and the official Windows client continues this tradition. Unlike the command-line operations on Linux, the Windows version focuses more on graphical management and tunnel switching. The configuration logic mainly revolves around generating key pairs and editing <code>.conf</code> files.</p>
<p><img decoding="async" loading="lazy" alt="0.wireguard" src="https://xiaoyeapp.com/assets/images/0.wireguard-f5dde7d9a5973a0ee123025ef7f0dc5c.png" width="800" height="460" class="img_ev3q"></p>
<!-- -->
<p>The following configuration is based on two Windows devices. <strong>Node A</strong> has a public IP address (or has port mapping configured) and acts as the "central node" waiting for connections. <strong>Node B</strong> is behind a NAT (internal network) and actively connects to Node A to achieve mutual communication.</p>
<p><strong>The core logic</strong> is: A is responsible for "waiting for connections," while B is responsible for "finding A." This "waiting" does not mean a persistent connection is established; instead, B maintains the data channel between the two by actively sending packets and establishing a keepalive mechanism. When B actively sends packets to A, B also leaves its external port on the router's public side, allowing A to send response data back to B.</p>
<hr>
<p><strong>1. Preliminary Preparation: Installation and Key Generation</strong></p>
<ul>
<li class=""><strong>1-1.</strong> Two Windows devices: Node A (with a public IP), Node B (behind NAT, just needs internet access).</li>
<li class=""><strong>1-2.</strong> Install the WireGuard client: The official website is currently blocked in China. You can find it on some domestic software sites, but be careful to ensure it is used only within China (e.g., from home to office). Cross-border forwarding will also be blocked.</li>
<li class=""><strong>1-3.</strong> Confirm A's port is reachable: A needs to allow a UDP port (e.g., 6000). Add an inbound rule in Windows Firewall. If there is a router in front of A, configure port mapping on the router to map the public IP's port 6000 to A's internal IP.</li>
<li class=""><strong>1-4.</strong> Prepare to record public keys: During the configuration process, you will need to copy each other's public keys. It is recommended to open Notepad in advance for temporary storage.</li>
</ul>
<hr>
<p><strong>2. Configure Node A (Public Node)</strong></p>
<p>Node A's core role is to listen on a publicly reachable UDP port, waiting for B to connect. It also assigns itself a virtual IP for identification within the virtual network.</p>
<p>Edit the configuration file: In the WireGuard main interface, select Node A's tunnel, click "Edit," and add the following content.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/1-3b7c137e4062912205eefab6b645c445.png" width="486" height="393" class="img_ev3q"></p>
<p>Among them, <strong>Public Key</strong> and <strong>Private Key</strong> are automatically generated key pairs; you only need to configure the listening port and the virtual address.</p>
<p><strong>Address</strong> specifies Node A's IP within the virtual network; <strong>ListenPort</strong> is the port A listens on. Ensure this port is allowed in Windows Firewall and the router (if applicable).</p>
<p>After saving, the configuration will look like the example shown below. Note that the configuration is not yet complete—Node B's public key will be added later.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/2-a5eabd7066dbca4f8679720c6ed38add.png" width="623" height="393" class="img_ev3q"></p>
<hr>
<p><strong>3. Configure Node B (Client Node)</strong></p>
<p>Node B, as the device that initiates the connection, needs to know who to connect to and its own virtual IP.</p>
<p>Edit the configuration file: In the WireGuard main interface, select Node B's tunnel, click "Edit," and add the following content.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/3-cfd67ee63462c3420c1356a0ec5879c2.png" width="486" height="393" class="img_ev3q"></p>
<p>Among them, <strong>PrivateKey</strong> and <strong>PublicKey</strong> are automatically generated; <strong>Address</strong> is set by yourself.</p>
<hr>
<p><strong>4. Add Each Other to Peer Lists</strong></p>
<p>Now that both A and B have their own key pairs, the next step is to add each other's public keys to their respective Peer lists. The added form is as follows:</p>
<ul>
<li class=""><strong>Node A</strong>:</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/4-4353d7c8e916e575ff4eea8e87da7fdc.png" width="486" height="393" class="img_ev3q"></p>
<ul>
<li class=""><strong>Node B</strong>: As the active connection initiator, Node B adds two additional items: <strong>Endpoint</strong> and <strong>PersistentKeepalive</strong>.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/5-930f93bcda57dc3278d6ea7428945cdc.png" width="486" height="393" class="img_ev3q"></p>
<ul>
<li class=""><strong>Endpoint</strong> specifies Node A's public IP and listening port.</li>
<li class=""><strong>AllowedIPs = 10.10.10.1/24</strong> controls the packet matching rules for outbound/inbound traffic handled by the WireGuard driver.</li>
<li class=""><strong>PersistentKeepalive = 25</strong> ensures B sends keepalive packets every 25 seconds to maintain NAT mappings, allowing A to actively send data to B.</li>
</ul>
<hr>
<p><strong>5. Start and Verify the Connection</strong></p>
<ul>
<li class=""><strong>Startup sequence</strong>: Connect Node A (public node) first, then Node B.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/6-50e9e540358d1ad770b25112eddee2ca.png" width="659" height="332" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/7-b33accbe8fd9b2ef4e15f83a9ac4ad79.png" width="623" height="356" class="img_ev3q"></p>
<ul>
<li class=""><strong>Verification method</strong>: Ping each other's virtual IP from Node A and Node B. If successful, the connection is working.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/8-6ffda0c3fd3885b8280fb522fe57cc26.png" width="582" height="262" class="img_ev3q"></p>]]></content:encoded>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[Xiaoye Remote 3.0.5: HTTP Sharing - A Simpler Way to Shre Files]]></title>
            <link>https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare</link>
            <guid>https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare</guid>
            <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We are pleased to announce the official release of Xiaoye Remote 3.0.5! This update brings a highly anticipated core feature – HTTP Sharing – making file sharing between different devices simpler and more flexible than ever before.]]></description>
            <content:encoded><![CDATA[<p>We are pleased to announce the official release of <strong>Xiaoye Remote 3.0.5</strong>! This update brings a highly anticipated core feature – <strong>HTTP Sharing</strong> – making file sharing between different devices simpler and more flexible than ever before.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-is-http-sharing">What is HTTP Sharing?<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#what-is-http-sharing" class="hash-link" aria-label="Direct link to What is HTTP Sharing?" title="Direct link to What is HTTP Sharing?" translate="no">​</a></h2>
<p>HTTP Sharing is a one-click file sharing feature provided by Xiaoye Remote. Once you start the service, you can add files to the mapping list, and others can easily access your shared files through the HTTP links you generate.</p>
<p><strong>Wide range of applicable scenarios</strong>: Whether on a local network at home or in the office, through the virtual subnet built by Xiaoye Remote, or even in broader network environments, you can quickly achieve file sharing.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="how-to-use-http-sharing">How to Use HTTP Sharing?<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#how-to-use-http-sharing" class="hash-link" aria-label="Direct link to How to Use HTTP Sharing?" title="Direct link to How to Use HTTP Sharing?" translate="no">​</a></h2>
<p>The entire process is designed to be intuitive and can be completed in just a few steps:</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-run-xiaoye-remote-app">1. Run Xiaoye Remote App<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#1-run-xiaoye-remote-app" class="hash-link" aria-label="Direct link to 1. Run Xiaoye Remote App" title="Direct link to 1. Run Xiaoye Remote App" translate="no">​</a></h3>
<p>Launch the Xiaoye Remote App and navigate to the HTTP Sharing feature homepage. By default, the service is in a stopped state, and the interface is clear and concise.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-us-xiaoyeremote-http-01-73fd542a509babffae98620ea31a3a70.png" width="1234" height="721" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-start-the-service">2. Start the Service<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#2-start-the-service" class="hash-link" aria-label="Direct link to 2. Start the Service" title="Direct link to 2. Start the Service" translate="no">​</a></h3>
<p>Click the <strong>"Start"</strong> button at the top. Once the service starts successfully, you will see an indicator showing that the service is running, indicating it is ready to receive file mappings.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-us-xiaoyeremote-http-02-747a2cd0e5be127c9d69fc46dfb4edf7.png" width="1234" height="721" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-add-files-to-share">3. Add Files to Share<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#3-add-files-to-share" class="hash-link" aria-label="Direct link to 3. Add Files to Share" title="Direct link to 3. Add Files to Share" translate="no">​</a></h3>
<p>You can add files or directories to share in two ways:</p>
<ul>
<li class=""><strong>Direct Drag &amp; Drop</strong>: Drag files or folders directly into the URI mapping table area</li>
<li class=""><strong>Manual Addition</strong>: Click the <strong>"Add File"</strong> or <strong>"Add Directory"</strong> button and select files in the file manager window</li>
</ul>
<p>You can flexibly add multiple files or entire folders as needed to build your sharing list.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-view-in-browser">4. View in Browser<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#4-view-in-browser" class="hash-link" aria-label="Direct link to 4. View in Browser" title="Direct link to 4. View in Browser" translate="no">​</a></h3>
<p>After adding files, click the <strong>"Open in Browser"</strong> operation, and you will see a basic file sharing list page.</p>
<p><strong>Local Network Access</strong>: If another device is on the same local network as your device, simply enter <code>http://&lt;your_local_IP&gt;</code> in the browser to access and download files.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-us-xiaoyeremote-http-03-272440bfda5c28449fb9de4a56a41515.png" width="1058" height="465" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-share-in-subnet-or-public-network">5. Share in Subnet or Public Network<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#5-share-in-subnet-or-public-network" class="hash-link" aria-label="Direct link to 5. Share in Subnet or Public Network" title="Direct link to 5. Share in Subnet or Public Network" translate="no">​</a></h3>
<p>You may also want to access shared files through other network environments. Xiaoye Remote provides you with a more flexible solution:</p>
<ol>
<li class=""><strong>Log in to your account</strong>: Click the avatar in the upper left corner to log in to your Xiaoye Pass account</li>
<li class=""><strong>Enable Subnet/Public Network</strong>: After logging in, return to the HTTP Sharing page and click the <strong>"Subnet/Public Network"</strong> enable button</li>
<li class=""><strong>Get access links</strong>: Once enabled, you will see two types of links:</li>
</ol>
<ul>
<li class=""><strong>Subnet URI</strong>: Accessible between two devices logged in with the same Xiaoye Pass account, or between devices that have joined the same network group – ideal for team collaboration or multi-device synchronization</li>
<li class=""><strong>Public Network URI</strong>: You can access this link from any other device or mobile phone (if access fails, wait a few seconds and refresh to try again)</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="friendly-reminder">Friendly Reminder<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#friendly-reminder" class="hash-link" aria-label="Direct link to Friendly Reminder" title="Direct link to Friendly Reminder" translate="no">​</a></h2>
<p>For your data security, <strong>please disable the relevant features promptly when sharing is no longer needed</strong>. Xiaoye Remote always prioritizes your privacy and security.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="version-message">Version Message<a href="https://xiaoyeapp.com/blog/2026/07/01/v305-httpshare#version-message" class="hash-link" aria-label="Direct link to Version Message" title="Direct link to Version Message" translate="no">​</a></h2>
<p>The HTTP Sharing feature in Xiaoye Remote 3.0.5 is designed to provide you with a <strong>simple, flexible, and secure</strong> way to share files. Whether you're sharing photos with family on your home local network, collaborating with colleagues by transferring documents in an office environment, or achieving more flexible access through subnet/public network features, HTTP Sharing makes the entire process easier and more efficient.</p>
<p><strong>Xiaoye Remote 3.0.5 is now available for download</strong>. Welcome to visit our official website or app store to update to the latest version and experience the new HTTP Sharing feature!</p>]]></content:encoded>
            <category>News</category>
        </item>
        <item>
            <title><![CDATA[gRPC in .NET: From Zero to Working Example]]></title>
            <link>https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc</link>
            <guid>https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc</guid>
            <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In today's era of microservices and cloud-native architectures, communication efficiency between services has become a key bottleneck for system performance. Are you still troubled by the inefficient serialization of REST APIs? Are you looking for a communication solution that is both cross-language and high-performance? Today, let's get to know gRPC and how the .NET ecosystem perfectly supports this modern RPC framework.]]></description>
            <content:encoded><![CDATA[<p>In today's era of microservices and cloud-native architectures, communication efficiency between services has become a key bottleneck for system performance. Are you still troubled by the inefficient serialization of REST APIs? Are you looking for a communication solution that is both cross-language and high-performance? Today, let's get to know gRPC and how the .NET ecosystem perfectly supports this modern RPC framework.</p>
<p>If you are already familiar with the concepts of gRPC, you can skip directly to Chapter 3; if you are already proficient with gRPC, you can skip this article entirely ^_^</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-what-is-grpc-why-is-it-so-important">1. What is gRPC? Why is it so important?<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#1-what-is-grpc-why-is-it-so-important" class="hash-link" aria-label="Direct link to 1. What is gRPC? Why is it so important?" title="Direct link to 1. What is gRPC? Why is it so important?" translate="no">​</a></h2>
<p>gRPC is a high-performance Remote Procedure Call framework open-sourced by Google. It is based on the HTTP/2 protocol and uses Protocol Buffers (protobuf) as the interface definition language and data serialization format.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-1-0ecbddc0af0818eef9c71088e1febf22.png" width="552" height="327" class="img_ev3q"></p>
<p><strong>Several core advantages of gRPC:</strong></p>
<ul>
<li class=""><strong>High Performance:</strong> Uses protobuf binary serialization, which is smaller and faster than JSON.</li>
<li class=""><strong>Multi-language Support:</strong> Supports multiple languages including C++, Java, Python, Go, and C#.</li>
<li class=""><strong>Bidirectional Streaming Communication:</strong> Based on HTTP/2, supports both client-side and server-side bidirectional streaming.</li>
<li class=""><strong>Strong Typing:</strong> Explicitly defines interfaces through <code>.proto</code> files, generating strongly-typed code.</li>
<li class=""><strong>Automatic Code Generation:</strong> Improves development efficiency and reduces the need to manually write boilerplate code.</li>
</ul>
<p><strong>Several communication patterns of gRPC:</strong></p>
<ol>
<li class=""><strong>Unary RPC:</strong> The client sends a single request, and the server returns a single response. This is the most basic and commonly used interaction, perfectly comparable to REST API calls.</li>
<li class=""><strong>Server-side Streaming RPC:</strong> The client sends a request, and the server returns a streaming response.</li>
<li class=""><strong>Client-side Streaming RPC:</strong> The client sends a streaming request, and the server returns a single response.</li>
<li class=""><strong>Bidirectional Streaming RPC:</strong> Both sides send streaming messages simultaneously.</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-net-support-for-grpc-mature-and-powerful">2. .NET Support for gRPC: Mature and Powerful<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#2-net-support-for-grpc-mature-and-powerful" class="hash-link" aria-label="Direct link to 2. .NET Support for gRPC: Mature and Powerful" title="Direct link to 2. .NET Support for gRPC: Mature and Powerful" translate="no">​</a></h2>
<p>Microsoft's support for gRPC is a full commitment. Since .NET Core 3.0, gRPC has become a first-class citizen on the .NET platform.</p>
<p><strong>Official Support Status:</strong></p>
<table><thead><tr><th>Component</th><th>Package Name</th><th>Purpose</th></tr></thead><tbody><tr><td>gRPC Server</td><td>Microsoft.AspNetCore.App (built-in)</td><td>Create gRPC services in <a href="https://asp.net/" target="_blank" rel="noopener noreferrer" class="">ASP.NET</a> Core</td></tr><tr><td>gRPC Client</td><td>Grpc.Net.Client</td><td>Call gRPC services from .NET Core</td></tr><tr><td>Code Generation Tools</td><td><a href="https://grpc.tools/" target="_blank" rel="noopener noreferrer" class="">Grpc.Tools</a></td><td>Generate C# code from <code>.proto</code> files</td></tr><tr><td>Protobuf Support</td><td>Google.Protobuf</td><td>Protocol Buffers serialization support</td></tr></tbody></table>
<p><strong>.NET gRPC Technical Features:</strong></p>
<ul>
<li class=""><strong>Fully Managed Implementation:</strong> Native .NET implementation, no dependency on C++ libraries.</li>
<li class=""><strong>Seamless Integration with <a href="https://asp.net/" target="_blank" rel="noopener noreferrer" class="">ASP.NET</a> Core:</strong> Shares configuration, logging, dependency injection, and other infrastructure.</li>
<li class=""><strong>Excellent Performance:</strong> Microsoft official benchmarks show gRPC significantly outperforms traditional REST APIs.</li>
<li class=""><strong>Cross-platform Support:</strong> Runs perfectly on Windows, Linux, and macOS.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-hands-on-creating-a-complete-grpc-service-and-client">3. Hands-on: Creating a Complete gRPC Service and Client<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#3-hands-on-creating-a-complete-grpc-service-and-client" class="hash-link" aria-label="Direct link to 3. Hands-on: Creating a Complete gRPC Service and Client" title="Direct link to 3. Hands-on: Creating a Complete gRPC Service and Client" translate="no">​</a></h2>
<p>Now, let's create a basic gRPC example, including both the server and the client.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="31-environment-setup">3.1 Environment Setup<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#31-environment-setup" class="hash-link" aria-label="Direct link to 3.1 Environment Setup" title="Direct link to 3.1 Environment Setup" translate="no">​</a></h3>
<ul>
<li class="">Visual Studio 2022 (requires the "<a href="https://asp.net/" target="_blank" rel="noopener noreferrer" class="">ASP.NET</a> and web development" workload, as shown below)</li>
<li class="">.NET 6.0 SDK or higher</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-2-d14da9a7fbc459069e5fd2b963d4d21f.png" width="846" height="382" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="32-create-the-grpc-server">3.2 Create the gRPC Server<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#32-create-the-grpc-server" class="hash-link" aria-label="Direct link to 3.2 Create the gRPC Server" title="Direct link to 3.2 Create the gRPC Server" translate="no">​</a></h3>
<p><strong>Step 1: Create the project</strong></p>
<ol>
<li class="">Launch Visual Studio and select "Create a new project".</li>
<li class="">Search for "gRPC" and select the "<a href="https://asp.net/" target="_blank" rel="noopener noreferrer" class="">ASP.NET</a> Core gRPC Service" template.</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-3-0e8bf5e12a20f99b41cc598dd631e280.png" width="755" height="206" class="img_ev3q"></p>
<ol start="3">
<li class="">Name the project <code>GrpcGreeter</code>.</li>
<li class="">Select the .NET version (recommend .NET 8.0 or higher).</li>
</ol>
<p><strong>Step 2: Examine the project structure</strong></p>
<p>After creation, you will see the following core files:</p>
<ul>
<li class=""><code>Protos/greet.proto</code>: The interface definition file for the gRPC service. It contains a request/response data structure and an interface function <code>SayHello</code>.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-4-e63ac384aacf6139e3dfb3cf431bd567.png" width="1003" height="520" class="img_ev3q"></p>
<ul>
<li class=""><code>Services/GreeterService.cs</code>: Implements the business logic of the gRPC service.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-5-59ea0e9f2be62234e7a98afdde1cf58a.png" width="1113" height="617" class="img_ev3q"></p>
<p><strong>Step 3: Run the server</strong></p>
<p>Press F5 to run the service. The console will display the address the service is listening on, e.g., <code>https://localhost:7208</code>.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-6-da53f6647d9fddc10ab6499651cde889.png" width="597" height="258" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="33-create-the-grpc-client">3.3 Create the gRPC Client<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#33-create-the-grpc-client" class="hash-link" aria-label="Direct link to 3.3 Create the gRPC Client" title="Direct link to 3.3 Create the gRPC Client" translate="no">​</a></h3>
<p><strong>Step 1: Create a Console App</strong></p>
<ol>
<li class="">Open another instance of Visual Studio.</li>
<li class="">Create a "Console App" project and name it <code>GrpcGreeterClient</code>.</li>
</ol>
<p>Add the following NuGet packages to the client console project; their purposes are described at the beginning of the article.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-7-53fc1bb01408b66b4a07d7973b5a565d.png" width="560" height="211" class="img_ev3q"></p>
<p><strong>Step 2: Add the proto file</strong></p>
<ol>
<li class="">Create a <code>Protos</code> folder in the client project and copy the <code>greet.proto</code> file from the server into this folder.</li>
<li class="">Modify the namespace in <code>greet.proto</code> to distinguish it (optional, not modifying it also works fine).</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/net-grpc-8-303ee13c85e38a4d00d9d4c175946321.png" width="988" height="280" class="img_ev3q"></p>
<p>Edit the <code>.csproj</code> file to include the proto file in the project's build process:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Protobuf</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Protos\greet.proto</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">GrpcServices</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Client</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p><strong>Step 3: Write the client code and run it</strong></p>
<p>Add our request code to the console project, and you will receive a response from the server. <code>SayHelloAsync</code> is an asynchronous function auto-generated from the Proto file. Here we have completed a complete RPC interaction using the simplest unary RPC mode of gRPC. Note that no valid HTTPS certificate was added for the server, so using HTTPS directly would cause certificate errors. Therefore, HTTP is used temporarily.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-net-grpc-9-5f39498ab8ee3fcd0d6d1e9256ca4d65.png" width="706" height="305" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-summary-typical-use-cases-for-grpc">4. Summary: Typical Use Cases for gRPC<a href="https://xiaoyeapp.com/blog/2026/06/10/net-with-grpc#4-summary-typical-use-cases-for-grpc" class="hash-link" aria-label="Direct link to 4. Summary: Typical Use Cases for gRPC" title="Direct link to 4. Summary: Typical Use Cases for gRPC" translate="no">​</a></h2>
<p>✅ <strong>Scenarios suitable for gRPC:</strong></p>
<ul>
<li class=""><strong>Microservices Communication:</strong> High-performance, low-latency internal service calls.</li>
<li class=""><strong>Real-time Services:</strong> Scenarios requiring streaming data transmission (e.g., chat, location sync).</li>
<li class=""><strong>Multi-language Environments:</strong> Services written in different languages need efficient communication.</li>
<li class=""><strong>Mobile Clients:</strong> Binary transmission saves traffic and battery life.</li>
</ul>
<p>❌ <strong>Although gRPC is powerful, there are scenarios where it is less suitable compared to REST APIs:</strong></p>
<ul>
<li class=""><strong>Direct Browser Calls:</strong> Requires a grpc-web proxy, less convenient than REST.</li>
<li class=""><strong>Public-facing APIs:</strong> Requires broad client support.</li>
<li class=""><strong>Simple Query Scenarios:</strong> When the overhead of REST is acceptable, there's no need for additional complexity.</li>
</ul>
<p>Through the introduction in this article, you can see .NET's comprehensive support for gRPC. From creating the server to writing the client, the entire process is smooth and natural. gRPC's features, such as high performance, strong typing, and multi-language support, make it a powerful communication tool for modern microservice architectures.</p>
<p>With the continuous development of the .NET platform, the application of gRPC in .NET will become even more widespread. The official team is also constantly optimizing the performance and experience of gRPC, positioning it as the preferred solution for future service-to-service communication.</p>]]></content:encoded>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[WinUI becomes the "default choice" for native app development on Windows]]></title>
            <link>https://xiaoyeapp.com/blog/2026/06/04/build2026-winui</link>
            <guid>https://xiaoyeapp.com/blog/2026/06/04/build2026-winui</guid>
            <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[At the recently concluded Build 2026 developer conference, Microsoft sent a clear signal to Windows developers worldwide: the era of native apps is back, and WinUI is its core engine.]]></description>
            <content:encoded><![CDATA[<p>At the recently concluded Build 2026 developer conference, Microsoft sent a clear signal to Windows developers worldwide: the era of native apps is back, and WinUI is its core engine.</p>
<p>Although Microsoft hasn't announced an abandonment of web technologies or cross-platform frameworks, company executives repeatedly emphasized across multiple key sessions that <strong>WinUI is now the preferred framework for building modern, high-performance, AI-ready native applications on Windows 11.</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-from-one-of-many-options-to-production-platform-why-is-microsoft-going-all-in-on-winui">1. From "one of many options" to "production platform": Why is Microsoft going all-in on WinUI?<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#1-from-one-of-many-options-to-production-platform-why-is-microsoft-going-all-in-on-winui" class="hash-link" aria-label="Direct link to 1. From &quot;one of many options&quot; to &quot;production platform&quot;: Why is Microsoft going all-in on WinUI?" title="Direct link to 1. From &quot;one of many options&quot; to &quot;production platform&quot;: Why is Microsoft going all-in on WinUI?" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/build2026-winui-1-159d49b784680a9fce965711eec8608e.png" width="906" height="596" class="img_ev3q"></p>
<!-- -->
<p>In recent years, the Windows app ecosystem has become fragmented: Electron, React Native, Flutter, Tauri… developers have many choices, but system experience has suffered as a result — memory usage high, startup slow, interface styles inconsistent.</p>
<p>At Build 2026, Chris Anderson, Microsoft's Corporate Vice President of Windows UI &amp; AI, directly answered the community's most pressing question: "We will not build another new framework. WinUI is the production platform for Windows apps."</p>
<p>To cement this promise, Microsoft even dropped the "3" version number, simplifying it to just "WinUI", signifying a commitment to:</p>
<ul>
<li class="">No disruptive refactoring</li>
<li class="">No plans to abandon or replace it</li>
<li class="">Long-term, stable investment suitable for enterprise applications</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-mastering-the-fundamentals-addressing-tearing-memory-and-control-gaps">2. Mastering the fundamentals: addressing tearing, memory, and control gaps<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#2-mastering-the-fundamentals-addressing-tearing-memory-and-control-gaps" class="hash-link" aria-label="Direct link to 2. Mastering the fundamentals: addressing tearing, memory, and control gaps" title="Direct link to 2. Mastering the fundamentals: addressing tearing, memory, and control gaps" translate="no">​</a></h2>
<p>Previously, developer concerns about WinUI centered on foundational experience and missing enterprise controls. Microsoft has now provided a concrete roadmap:</p>
<table><thead><tr><th>Pain Point</th><th>Microsoft's Commitment &amp; Action</th></tr></thead><tbody><tr><td>Black borders/tearing when resizing windows</td><td>Fully transitioning to a system-level compositor to fix rendering</td></tr><tr><td>High memory usage</td><td>Engineering resources already invested to optimize memory usage patterns</td></tr><tr><td>Lack of DataGrid and Charts</td><td>Confirmed coming soon, prioritizing enterprise scenarios</td></tr><tr><td>Version iteration risk</td><td>Downplaying version numbers, ensuring long-term compatibility</td></tr></tbody></table>
<blockquote>
<p>"The top priority is to improve performance, solidify the foundation, ensure quality, and fix a large number of bugs." — Chris Anderson</p>
</blockquote>
<p>These improvements mean WinUI is no longer just a "demo-grade" framework, but a true platform for building enterprise-grade applications like financial dashboards, HR management tools, and billing software.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-built-for-the-ai-agent-era-winui--ai-workflows">3. Built for the AI agent era: WinUI + AI workflows<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#3-built-for-the-ai-agent-era-winui--ai-workflows" class="hash-link" aria-label="Direct link to 3. Built for the AI agent era: WinUI + AI workflows" title="Direct link to 3. Built for the AI agent era: WinUI + AI workflows" translate="no">​</a></h2>
<p>Microsoft also highlighted WinUI's new positioning for the AI era — <strong>natively supporting AI agent workflows</strong>.</p>
<p>Specifically, this includes:</p>
<ul>
<li class="">Developers leveraging AI agents to help <strong>plan, build, and optimize</strong> WinUI applications</li>
<li class="">Enabling <strong>intelligent migration</strong> of legacy applications (WinForms/WPF) to WinUI</li>
<li class="">Providing <strong>clearer control flow and faster iteration experience</strong> for AI-assisted programming</li>
</ul>
<p>In other words, Microsoft isn't simply "adding AI" on top of WinUI; it's optimizing the framework itself for AI-driven development processes.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/build2026-winui-2-b8f2ba5027b4ae9378a9ca9289671c20.png" width="1238" height="650" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-open-but-focused-winui-coexists-with-other-frameworks">4. Open but focused: WinUI coexists with other frameworks<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#4-open-but-focused-winui-coexists-with-other-frameworks" class="hash-link" aria-label="Direct link to 4. Open but focused: WinUI coexists with other frameworks" title="Direct link to 4. Open but focused: WinUI coexists with other frameworks" translate="no">​</a></h2>
<p>Microsoft hasn't "declared war" on other frameworks. Windows remains an open platform, and excellent patterns from React, SwiftUI, and Compose will be referenced. But Microsoft's clear hope is: <strong>when developers want to build the best possible native Windows experience, they think of WinUI first.</strong></p>
<p>To that end, Microsoft has also increased WinUI's transparency — moving almost entirely to public code repositories — and promises "foolproof" interoperability between WinForms/WPF and WinUI, allowing enterprises to migrate progressively rather than rewrite overnight.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-signs-of-windows-returning-inside-microsoft">5. Signs of "Windows returning" inside Microsoft<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#5-signs-of-windows-returning-inside-microsoft" class="hash-link" aria-label="Direct link to 5. Signs of &quot;Windows returning&quot; inside Microsoft" title="Direct link to 5. Signs of &quot;Windows returning&quot; inside Microsoft" translate="no">​</a></h2>
<p>Multiple foreign media outlets commented after Build 2026: <strong>This is the conference with the most discussion about Windows native apps from Microsoft in recent years.</strong></p>
<p>Specific evidence includes:</p>
<ul>
<li class="">Forming a new team specifically focused on Windows 11 native app development</li>
<li class="">Beginning to rewrite the "Start Menu's" recommendations and "All apps" list from React Native to native implementation</li>
<li class="">Planning to rewrite File Explorer using WinUI to achieve a consistent experience across the system</li>
</ul>
<p>These actions suggest Windows' strategic priority within Microsoft is rising again, and WinUI is the technical foundation of that strategy.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="6-partnering-with-developers-to-build-next-generation-windows-applications">6. Partnering with developers to build next-generation Windows applications<a href="https://xiaoyeapp.com/blog/2026/06/04/build2026-winui#6-partnering-with-developers-to-build-next-generation-windows-applications" class="hash-link" aria-label="Direct link to 6. Partnering with developers to build next-generation Windows applications" title="Direct link to 6. Partnering with developers to build next-generation Windows applications" translate="no">​</a></h2>
<p>As observers who have long followed Windows technology evolution, we believe a good framework requires continuous iteration with real-world development scenarios. WinUI is rapidly addressing its shortcomings, and we've already accumulated practical experience in areas like remote control and enterprise office tools (see case study: <strong>Xiaoye Remote</strong>).</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/build2026-winui-3-7f9f3b0606f5c679b5434eaf9c1ad025.png" width="985" height="490" class="img_ev3q"></p>
<p>If you or your team are planning Windows app development, or looking to modernize and migrate existing applications to WinUI, please contact us. We can assess feasibility, design architecture together, and leverage WinUI's native performance and AI-ready capabilities to build a better product.</p>
<p>Today, with Microsoft fully committed to WinUI, it's the perfect time to embrace the native Windows ecosystem.</p>]]></content:encoded>
            <category>WinUI</category>
        </item>
        <item>
            <title><![CDATA[WinUI 3 Data Binding: How to Make the UI Update Automatically]]></title>
            <link>https://xiaoyeapp.com/blog/2026/05/19/winui3-binding</link>
            <guid>https://xiaoyeapp.com/blog/2026/05/19/winui3-binding</guid>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[1. What is UI Automatic Update?]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-what-is-ui-automatic-update">1. What is UI Automatic Update?<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#1-what-is-ui-automatic-update" class="hash-link" aria-label="Direct link to 1. What is UI Automatic Update?" title="Direct link to 1. What is UI Automatic Update?" translate="no">​</a></h2>
<p>Imagine a common scenario:</p>
<p>You type in an input box, and a text label on the other side of the screen changes synchronously, without you needing to click any "Save" or "Refresh" button.</p>
<p>This is UI automatic update.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="without-data-binding">Without Data Binding<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#without-data-binding" class="hash-link" aria-label="Direct link to Without Data Binding" title="Direct link to Without Data Binding" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="532" height="80" class="img_ev3q"></p>
<p>The more places where data changes, the more manual data-moving code you write. If you miss one place when modifying a field, the UI will display inconsistently.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="with-data-binding">With Data Binding<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#with-data-binding" class="hash-link" aria-label="Direct link to With Data Binding" title="Direct link to With Data Binding" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="436" height="72" class="img_ev3q"></p>
<!-- -->
<p>The middle two steps are completely handled by the framework. You only need to do one thing: <strong>tell the UI what the relationship with the data is</strong>.</p>
<p>The following diagram shows a text input box and a text label displaying text. When you type in the text box, the text is automatically passed to the bound variable, and then reversely bound to the text label, achieving real-time automatic update.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/input-output-96db79b39a1c4a18995eca340500464d.webp" width="1800" height="1080" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-two-core-concepts-for-ui-automatic-update">2. Two Core Concepts for UI Automatic Update<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#2-two-core-concepts-for-ui-automatic-update" class="hash-link" aria-label="Direct link to 2. Two Core Concepts for UI Automatic Update" title="Direct link to 2. Two Core Concepts for UI Automatic Update" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="21-data-binding-establishing-the-connection">2.1 Data Binding: Establishing the Connection<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#21-data-binding-establishing-the-connection" class="hash-link" aria-label="Direct link to 2.1 Data Binding: Establishing the Connection" title="Direct link to 2.1 Data Binding: Establishing the Connection" translate="no">​</a></h3>
<p>Declare in XAML: "This property of this control equals that property of that data."</p>
<p>For example:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">TextBlock</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Text</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">{x:Bind UserName}</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<p>This line means: the content displayed by this TextBlock always equals the "UserName" data.</p>
<p><strong>No C# code is needed to assign values.</strong></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="22-inotifypropertychanged-sending-notifications">2.2 INotifyPropertyChanged: Sending Notifications<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#22-inotifypropertychanged-sending-notifications" class="hash-link" aria-label="Direct link to 2.2 INotifyPropertyChanged: Sending Notifications" title="Direct link to 2.2 INotifyPropertyChanged: Sending Notifications" translate="no">​</a></h3>
<p>This is the biggest pitfall for beginners.</p>
<p>WinUI does <strong>not automatically detect</strong> changes to ordinary C# properties. You must have the data class actively say "I've changed."</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public string UserName { get; set; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">private string _userName;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">public string UserName</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    get =&gt; _userName;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    set</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _userName = value;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        NotifyUIChanged();</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>There are multiple ways to send notifications:</p>
<p><strong>Method 1: Native INotifyPropertyChanged</strong></p>
<p>Implement the <code>INotifyPropertyChanged</code> interface, implement the <code>OnPropertyChanged</code> method, and call the notification interface when the bound variable changes.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public event PropertyChangedEventHandler PropertyChanged;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">private void OnPropertyChanged([CallerMemberName] string propertyName = null)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Method 2: Using CommunityToolkit.Mvvm</strong></p>
<p>Use existing .NET libraries to simplify the notification process.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-basic-example-building-a-simple-app-launcher">3. Basic Example: Building a Simple App Launcher<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#3-basic-example-building-a-simple-app-launcher" class="hash-link" aria-label="Direct link to 3. Basic Example: Building a Simple App Launcher" title="Direct link to 3. Basic Example: Building a Simple App Launcher" translate="no">​</a></h2>
<p>Use a real project to tie all the concepts together. The interface is simple:</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/appui-dcb58d21371fa9c519b3a9fec687c02e.png" width="663" height="275" class="img_ev3q"></p>
<ul>
<li class="">GridView displays the app list (icon + name)</li>
<li class="">Clicking an app launches it</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="31-project-structure">3.1 Project Structure<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#31-project-structure" class="hash-link" aria-label="Direct link to 3.1 Project Structure" title="Direct link to 3.1 Project Structure" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/projectinfo-52770d1b594ce279023fffe05796e736.png" width="330" height="299" class="img_ev3q"></p>
<p>The structure is simplified here, mainly consisting of two parts:</p>
<ul>
<li class=""><strong>ViewModel</strong>: Contains data definitions and is responsible for notifications</li>
<li class=""><strong>MyAppsPage</strong>: The UI (XAML), responsible for display</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="32-data-model">3.2 Data Model<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#32-data-model" class="hash-link" aria-label="Direct link to 3.2 Data Model" title="Direct link to 3.2 Data Model" translate="no">​</a></h3>
<p>Define what each App looks like, mainly containing: icon, name, description.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAB9CAYAAABAgpqjAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAFURJREFUeJztnQuUFNWZx7969GOYAYYBCYQAqwcfEDbRFR+EhzwcVrIGxRCRRXmYdZEknhMjhvWAsDhgZFeWeHYJyh6GR4xZTDCKriCIwwADg5AlWRSQACpvZHjMMN0z04+q3K+qbr2ru6aHHpju+zunzvRUd1ffqvrX9333VtW/RGAwsgATFiMrMGExsgITFiMrZCSsbdu2deI47lZBEORkMskBI2cYPHhwpW2W7PE6Jb6FVV1dfXccos+LEB4lg5Rs4GoalDd4YOQQZD8XJ+VYnSQn1h39y/FZkydPPg2qoOxTStIKq6KiIhws4P4tytU8dlqsKr7AHwKZS+L3QsDISQJyYYfi5I2PXn/zkO++t37dvPtHj1lOZidNE5JSXCmFtWvXrltJlHrnNP9x11OBHWFg5AVxLgLnxD/BRfFgSa+SUfMrtm+ctHr5bx9esWLFOXwbDIFJXsvwFBZGKhTVZ8H/6RXhzgIj/0hAIxwNrWvfWex7+8QpD68lwrqfzMYSqAlUgSXAIzV6CgvTH0YqJirGeeEAdAjd2Oe/l7/2xBM/nLaKzIqAKjDEnB51XIWFhTrWVCz9MSjHwxuL+t78+NOlpaU7Nm3adJTMwtEAjFQx7a8lLboKK8FFFx8XNxcDg6GBafF88M+FEyY+MokI65dgiIlOlpToENbevXuLI411f1vHHwMGw0xt4LDQu/eDpeRlORgpkBbzMphSokNYtbW13fmCeFLmHGmTkedEoQbahTt0Ji+LQE2BWMQ3giEuHNVUUqJDWKIodmuCS57dSEb+gsGG5wQB1DHMdqAW8FiHU3HpunEIC0/TQCsya9BHwAVCROoJSMYTsKBq5BVb9uxhVVlZLgOCZCrQJnyNOsJopZ/ecwhLOffXwtM0s4ZuB15wnkLk5Di8sGUY5Bp0fTlywEqxGMy3iXjWkEoQRLKpk03wwtYRkANg1ELtBLQJ/6fCUnqLWbu6gSO1nJRogvnbjI2MEeT54VUgJxr1+QuqcmJDK8hk27odUDkIioiKS9AmxLtXmE3mbxlEjt5twIthmD1ks0V0bR08kEgRQjZxMOfWzQU8enjTBJAuFWYdKQ6yTGoqQST11WalLfYaa9agLcAFA3orOVsK0Wsn0g/BFEMPEz+p1p6mzd9Rlss505nfWk1KkvpVDOjrlq6uS9UWS3sSEjkYjfXEiC9L6nbjOO91pym4OdsnQxzFU6sLC1MfblDSSwCOT5ANZH2fioo3bYRZQythNtlR5p0tcyLZaCiCRmW+uhEDMGfYFs+Nh9FS4MhyK0Zo/2vfGfqRIlw5KZHigLdsJtoeVHH6DkCS7HSBLIO0TUg9XJOuLfp6KulVgmQMO16amEjEVwoZIrCybSNdv2uu68rIPLoeqbZPhrhW5FfnClIZjyGPWoRX+w5S0tgxC7be4/iYWsMZkWXBtnsUwZJerUOE+nK2DbHOkJIgkTKT5wUtegrqjuRMbSPv8fhbsr/OMv4GRhouTUpM1xYqYmU9k0akREFyRPwYfcrosh3roQqQKI8cD2q7F1QNU74LRGytkaqvvUuTJVkZDOHFoKdAFOSkI9rpgvXRq1WP4JAqb00zuPFRFGDauZxAFkZ2YnN2hByPg4RRVxDAD25tMS3NdhZOAjz0LAceyQJKuyl4MODCHFEWF9Q6u/zqCIvTzl+6DMOqR1alcmRxwTDMGb7d0btMhQzevTK146CqTggKShqVA2HLNzAdgqimaZo+pETzzkLQ6CCT9ITRwW0z+2lLS5GFkNILp5jrtGzT6sKiA6IYppXaiPxvB9Oa8lmtTuDFkO/wjanDbePpHQKXjoAFTCsQUNJhUkmDpI7L4DwETYkYebH4zqgtLcQ8rNPatH7EIrUHz8m+ooBSN1FxcbZjmVOjinUWrwhWdhMCrd1MtZJemJuUqEQb7FwQUSnfwDSY4ai9kRJtbffZloyhNZfPVJwNWk1YNFLhuqZKbSgkjkvCfP1Ixl3gLJ4x5Zm79TS1SAmPIQFau5k2NhcIuKceUr+hcHnZ2oloLlSksiYs/bea05aMfneEnoodPUXyk61xiitrwsIdj91imuN5LE5xCKFiWMrvYZSiI/SIIHKuQuSUHg/pwQXV30BRpQr9Ru0WMNokNYHEh5w7lB7xnJTiqm6fJGMg88Z4U7PbkiGYitWDzaizWktUSFaEtWDrYP+fdTmlgyP0vpBiUFbhvZHsy6G1m2+S/tJgqvX1OmXlpy1u28Hre+6fHQJXi2tvuOFaQOmu+x+7YjhhwnKBI7Vbc8euGFaYsEzQc3fqeUF2BW1LcAiroaHhy7DY/poWnO8arJk0pzbMRzhZIOWBv26yQ0BHjx49861b+4u4EHbdO8NMO+gC9dHai7bZroWoQ1jTpk1rrKz6cEuJeNN9eKMig0HpEO8jffrJwY+1f1OahLimvGhd/MXuwncGEmF1BAYDFKMQKG64pX7uazPxHJz9nkJ6X6GOq7BGjx6968OK9Wu68QMnnwnuZK4yDPhG5N7oB+9XrN2/f38tqEKi9xQmwBCW9106GvLLC1+Z/dzcZ/+hXvqyRz1/Chj5S6d4/2TkrPj5ywv/Yyeo4kEx0fsKY2CIC1Eil5uw8APchg0b6u+6664x94x84HcXQvu6nwptLwBGXiFCGHpE7m1I1BSdmDr1n38FqjYwSqGg8J7CRu01Citp/a47yu3S8+bNOwLzYPiat14vu6Xb1IdqQnuKavmjin8SI3cJyR2hk3QTdI7cFtn8wdY/vLjgpa1g3FKPEQoFFdUm882qvu7SkbSFRMc/9GjZM888s+U7Q++c2q9kxO2hQEE7YOQskVhd/dHDR/74ry/PeFerqaioMDqhmC5rUwSMiGXBS1g0X+IXUJH1ixYt2rFoEewnr7GniMLCoh7vgqXXfjA30tyD9vhQBxiVqKgukalO+x+DD3X38x2xwLRA5XriSZMm9ezSpUuP7t2731hUVNRFkiRBlmUOJ2C0aU6cOHHqq6++urRnz57T+/btQ/GYC3UlwIAqqMvaaxqt/A03mJC1L8J769dN6dix6DmJixfFoF6OCucCCb6eGbPlENfH+kZF+Q556hOPifWR+lOb3q9YuXjx4mowaipMfZe111i8u4oKSSusysrKrkI4+VYtd6zvAfHtjo38BWDkKCLotXP7cK/r//7hQc8Ou/f3fyyb+9JcEsUwQqGoaG+Q9gQl90WlYPvOzWNkLll+RHy3c63wOTDyh8v8MbhccKyoc9f+g/79ly+++fqKNeOXL19OB0fT+r17CmvXrl3dYtzl1z4JlHdmwwv5y/nAJ2KjeK7rP04et4pkr9GHDx82n86RobmpsEm6vPJYcDMTFQPQOfti6NPryl6a89yEcZPKwLAroinRX/FeXV39YC3/+d0XhAMBYDAIp4M7C27pNmnMk08+ufHVV181X+GA+Bt5j0N07ilxJ7uygaGD1+ZdCB0oHDj4zrFEWIfAMLM1j2F5n4RG1+SGpkjfy8w1mWGjVjgk9On5d3ib0FIwBk1ptEodsTTXZBz4YpfLMCzgUFO7UIcS8rIQjKsbzFc4IO6uyaFQ6GtR5prMSA11TY5qr7EWR3GlvR6LwUhFUJvC4HRNdje3vRKuydciioOex+36jGaDCnFzTdZhEYuRCRiVBNNkjlYKTFiMTLC7Jlsck5G8Fxa1VzLch63uyHYHZ8TuamO4LZMet9ntOUcfmGDD9XKpvBaW4hcVDCk+DdReSfHn4un724C3Oe9Rn3pXd+MgKJaPZbpfl9MFOV/IW2GZLSvNPg26TSWNZCg6kzAMV+SAxXzX7uJM/ew5mwtyvpC3wlLKAldnYfo2dR52DumpBrh2d2arWa/DyTjPyF9hufiAuuH1vgzsSuxU5K+wNBymuT7f93JnZqjkr7A8ngThfN85Wqy4M8MV8CfNYfJWWIazsAhCwGSLjb1CSOhOzE7nYerOHMvYpjsfyFthIaqzsPqAI6uzsP39kM3FuZGdFkpD3gjLy0E4nXtxpu7GqebnA3kjLEbrwoTFyApMWIys0CZdkxlXB/TLiieb4v4+awNdk7/5rb7KQhLKbWMMhkqB1BUu1Z0/Y5vt3zV5646PNhYnb3yoRtgHDAalU6xf7OMde9GEzXy7l6vBrWvKO/nl2Z9+4/phwy4JfylhUYuBhKUSaNfQs/6VV36+XZtlF5UFN2HJEyZMOPve+nXzepWMmn80tK49MPKe3pHvNbz2X+XL6urqqC2k+b5Ch1GIp6Pf/aPHlFds3zipC3/bt2sCe1kxn6fgE0p6NpXGjh44Ub127dojYNhwN5kms2uygmvE0j6UWLHs9fGPPDpuaaf2Nw/8IvxuETMIyS+KpK9Dr8h9kT/vPljxzM9+/g4YkYq6JlOvLBrFdFK6Jq9evfocmaYuXLjwe3cNmvSLi+LnBXWBz0IJPqo4kDByj/ZSLwjKhVDU1KcxcLnzpbIXF/2qsrLyNDhFFQGrua2l1kolLOqa3DBz5swPBgwYcGDixIlj+/Qbcl9YLChpX9jpOmDkHOcunDxeH41c2lK1d+fixYt3g9XgFkVEfUhxsgtLJ525rb6wPXv2nCDTr8lrDIl47z69C5beW8YuqcwtaCGONRXVAfUgRWc/FBhGLofHO5JKWDRqxbUFQGlpafuxY8cOLSws7B2PxwOJREKUJEm5p0z7y8gBjhw58iWJVuiB5Zb+MFLVg9M12UK63p6y4Keeeio89gf3vxAKtHv8onAo3sSfKwRGznLD7QMi3//B1p98euCT30374Y/KwUiBKC7qmuxpxY2kHUaorq6+M8E1rDnD7+56KrCDmkEwchkRCvGU3tf63/39Dys3DHpj1ZtPl5eXY2+NPuKEPjQAJ3+ndMxU7tq0IAo1PzoceKuY2XDnF3jG5WRoS7g2cOhvHvuncSv79ev34xkzZnzk9/uewqqqqrolAfVPfhpcUcwe4Zu/4CMFDxb8puOAgVP+c/jw4aUVFRUnwfoIOdeo5SksSWj6w5HAOyVMVAwcGD8ZrGz/9LM/eZkIazqousFCnvYcfbomf1w14yv+/3uyB2AyKOj3fl3xbQNmzpw5cuHChVu02VRQ/lyTk1L86TPibtbzY1ioCf2p6I6Btz1CXv4fGEMR1DU59WUz+ESKuNzIinWGA3TSvqnknm+Tl3jFC30qmFlcetRyCCuRSHRPilFfl58y8osmrhYKgkUoKsxmqBEcesCxLTqmpXu9O4Qly3JxApqYLQEjFXg6r0Cb8LV5bEuBXWflA8WxD6xOfy353LWA4UKYkVUA6oa6JofAj2uyX6iHgR271eK1ArV85E3ufNcqnts2g7Znab2xcdQx2SwqnRZFLNXFro3YW/Nty2Xcvm2ph8ScYVua52uanfV2M7el8xVYKmwjoIfErKHbQRBEmD1k89U+mGnKcxOXQtaEhRuBFziLw7B61Imqmax21NF5tLfg5jTs5WyM64bz7XUN/TwP6rKUeoL+hqA6x1gMa7W2Qoo2KPAizCHfldN9ztx2H+vnG8Vd0HrZW6q2p1tvFQFm4/zM29fKrsnJGMg82bliUDeB5QTRYiarC42sbBlZWVoPmMN9Kmdj2afxGbq+mH/LvGGVJ1ZwuGzqf6XaGjlckTmRzJcUV+T5ineW9rkUqcnP+jUL5cgyvE7TtT3VeivrlEWn5xYJC304OTGse0ch9IhQjc0qyS+IyhFFV1BKaKZmZtfipHo8L6gapqwcfgfDvSxxaZ2NW4rD3sjD6c/uimykJsHinkzxs37NSWd6QZ80t8Ff273IptNzVot33PhKOBaCIMicEnX0z+quxHbXYsnUrDTOxlcYNaKE1NhuH8mTk84ISVOTW3Xsa/28sR+01PCtzGNbp2x7il/JltNz1ot3OR4HCbu79MkN9veFkCXi8aZ6xK+zcUswd+2FoKCkBTkQ9n0Bfzr35JTrlwI/Pe6Wtj2bZL9XSOoqtTIg+TwgON6WU9guKqkU0jsbZ4r+OBNb/dGcozade7KcJVvJK9H2bJJVYRl1FTmSuJC1q0zrAUHwXkCamkEP3aSSt0iPpqF0ocElItId5vguJ5CfSdhm8UoN5dqJ8LN+LaE5bb8KZG+4wVS8qhs+BhL2Eom4qEjcXYkrNYNZs3Oxu7MxChSfEiGTdEC73PR3HR1zSVbKCYu9Np1n2vlcIOCaSjDl2duuuie7n2UwXJlTr1/G+G2723q3Ale+V6jVBhzJ9TwnWza8XSSqKzHuoJDNtdj4ji9nY2UsR10GTwpYmfw+1jbmjUx7ZLK2HEwhRs/VWDYvNSkHgH0HKWNnSeyeq+uLokqX5vysX6ao65O+7W7r3RqntDIWlpcLcXO/42c5aZ2Ntw5uwe9n7ors53NXaju5fy59272Wl22nZ3ZKh5EVmLAYWcHtYeNNnChcC0MhjDaMQ1ixWOxMONQuS31kRlsmIBdCUzza4OezDmGVlpZ+sX1nZVNI7liE1zgzGJQOUi84ffbkYdts/7fYJxLxNzol+k0/E9jJajCGTnFjv4b3K6q3gdPY1p9r8hu/fvP5R6c+Mv6iuL8ri1oMBJ3+pLrCmiVLluzVZiVNky8bI2nZsmXRUaNGTb2hxwO/PVCwugMw8ho0uO0V+W70X+Y8vwSM+wepa3IcDHGldE3GHqE0bty4yg2b173fWxz1wDFxcwHzcMhPsGC/ITq2Yf17G9fs3r37PFhdk+ltX80zt71v5Jgf//7tNee+ed3jk78o+N8OzMshv+gU75/8enRw9Der3lxRXl6OjymhkYreqGq+WdWXHTdoH46Ne3D8L6ZPn/7BQ+PHLBGCyS4XgwcL67mTILEIlpOgY3K7RI9Ecfym5KmTp/ZPmfHEquPHj6OzDI1UKCo0YEOHv4j2f7NdkxV1Ll26dB+ZHpgyZcodAwcOHNG915ABPMeF9A/LMkeQ8S8w2jSRSOTS/s+O7X/77Vl7SeqrAcMDi6Y/tIqs0/5S12SHR1Y6c1tqbKo4I69cuXI3mQ6R10VgdU1uS7fsMfyh1NpgdU3GSIWCuqT9NUerzF2TwYhiWLDhffsYtfBuWMd9ZYw2D93/KCzF7x/UCEUdkz093hE/rsmgLdgeElFY1OyWRa3cw1wO0R4gistscJu5azJY1Wj+IfwBeu8+E1buYRYWHa/C/W4eXnAVFeL3lA1dAB1ppb0DKip6uzUjdzA/mcJca5kd/DxpzrlAfVRVWzgKCQWm350NjFyC3o5iNq/VjdXSkclJZrMVs8+b3BltHNnjtSctuXrBHMEYDAt/BSktRAVCc5taAAAAAElFTkSuQmCC" width="150" height="125" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="33-viewmodel">3.3 ViewModel<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#33-viewmodel" class="hash-link" aria-label="Direct link to 3.3 ViewModel" title="Direct link to 3.3 ViewModel" translate="no">​</a></h3>
<p>This is the hub of data binding.</p>
<p>Here we mainly expose an app list using the <code>ObservableCollection</code> type, so the UI will automatically refresh when apps are added or removed.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public class AppLauncherViewModel : ObservableObject</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    public static ObservableCollection&lt;AppInfo&gt; AppItems;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="34-xaml-interface">3.4 XAML Interface<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#34-xaml-interface" class="hash-link" aria-label="Direct link to 3.4 XAML Interface" title="Direct link to 3.4 XAML Interface" translate="no">​</a></h3>
<p>Core binding syntax:</p>
<table><thead><tr><th>XAML Syntax</th><th>Meaning</th></tr></thead><tbody><tr><td><code>ItemsSource="{x:Bind AppItems}"</code></td><td>The GridView's data source is the Apps list from the ViewModel</td></tr><tr><td><code>Text="{x:Bind Icon}"</code></td><td>Inside the DataTemplate, bind to the current item's Icon</td></tr><tr><td><code>Text="{x:Bind Name}"</code></td><td>Inside the DataTemplate, bind to the current item's Name</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="35-running-effect">3.5 Running Effect<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#35-running-effect" class="hash-link" aria-label="Direct link to 3.5 Running Effect" title="Direct link to 3.5 Running Effect" translate="no">​</a></h3>
<p>The final running result is as follows:</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/apprunningwebp-ba0150bddcd0b11ba45a8bddb48ed3e7.webp" width="1912" height="1080" class="img_ev3q"></p>
<ul>
<li class="">The interface displays a row of app icons and names</li>
<li class="">Clicking any app launches the corresponding app</li>
</ul>
<p><strong>Throughout the process, no "click → find control → assign value" code was written.</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-summary">4. Summary<a href="https://xiaoyeapp.com/blog/2026/05/19/winui3-binding#4-summary" class="hash-link" aria-label="Direct link to 4. Summary" title="Direct link to 4. Summary" translate="no">​</a></h2>
<p>If you find that binding is not working, the most likely reasons are as follows:</p>
<table><thead><tr><th>Symptom</th><th>Possible Cause</th></tr></thead><tbody><tr><td>Data changed, but UI doesn't update</td><td>Property does not implement INotifyPropertyChanged</td></tr><tr><td>New data added to list, but GridView doesn't show it</td><td><code>Used List&lt;T&gt; instead of ObservableCollection</code></td></tr></tbody></table>
<p>WinUI 3 data binding is mainly about two things:</p>
<ol>
<li class=""><strong>Declare the relationship</strong>: Use binding syntax in XAML</li>
<li class=""><strong>Send notifications</strong>: Implement INotifyPropertyChanged in the ViewModel</li>
</ol>
<p>Once you understand this relationship, writing UI becomes "describing what the data looks like" instead of "moving data around manually". Code volume decreases, and bugs also decrease.</p>]]></content:encoded>
            <category>WinUI</category>
        </item>
        <item>
            <title><![CDATA[Xiaoye Remote Control 3.0.1 in Action: How to Set Up a Network Group Across Accounts]]></title>
            <link>https://xiaoyeapp.com/blog/2026/05/13/one-click-networking</link>
            <guid>https://xiaoyeapp.com/blog/2026/05/13/one-click-networking</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Background]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="background">Background<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h2>
<p>When using remote desktop software or accessing remote device resources, we often encounter this scenario:</p>
<p><strong>Two people have different devices logged into different accounts and want to access each other's network resources. What to do?</strong></p>
<p>For professionals, solutions like VPN or intranet penetration are possible, but for ordinary users, the setup cost is too high, and troubleshooting and maintenance can be challenging.</p>
<p><strong>The Network Group feature in Xiaoye Remote Control 3.0.1</strong> allows two people to easily form a network with their remote devices.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-is-a-network-group">What is a Network Group?<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#what-is-a-network-group" class="hash-link" aria-label="Direct link to What is a Network Group?" title="Direct link to What is a Network Group?" translate="no">​</a></h2>
<p>Simply put, a Network Group can be understood as a <strong>virtual local area network (VLAN)</strong>.</p>
<p>Pull devices from different accounts into the same "room" (Network Group), and they can access each other just like on the same local network, with direct virtual IP connections — no public IP address, no port forwarding required.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hands-on-cross-account-networking-with-two-devices">Hands-On: Cross-Account Networking with Two Devices<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#hands-on-cross-account-networking-with-two-devices" class="hash-link" aria-label="Direct link to Hands-On: Cross-Account Networking with Two Devices" title="Direct link to Hands-On: Cross-Account Networking with Two Devices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="environment-setup">Environment Setup<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#environment-setup" class="hash-link" aria-label="Direct link to Environment Setup" title="Direct link to Environment Setup" translate="no">​</a></h3>
<table><thead><tr><th>Role</th><th>Account</th><th>Device</th></tr></thead><tbody><tr><td>Creator</td><td>Account A</td><td>Windows Desktop</td></tr><tr><td>Joiner</td><td>Account B</td><td>Windows Laptop</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-create-a-network-group">Step 1: Create a Network Group<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#step-1-create-a-network-group" class="hash-link" aria-label="Direct link to Step 1: Create a Network Group" title="Direct link to Step 1: Create a Network Group" translate="no">​</a></h3>
<ol>
<li class="">Open Xiaoye Remote Control and log in to <strong>Account A</strong></li>
<li class="">Left menu: <strong>Network Group → Create Network Group</strong></li>
<li class="">Enter a name: <code>MyGroup</code> (only letters, numbers, and underscores are supported)</li>
<li class="">Click <strong>Create</strong></li>
</ol>
<p>After successful creation, the network group you created will appear in the list below.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260511-153921-0f09f85f80ba33cada8f529231ededc3.png" width="975" height="558" class="img_ev3q"></p>
<blockquote>
<p>💡 <strong>Tip</strong>: Click "Create and Join" to automatically add your current device to the group, saving an extra step.</p>
</blockquote>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-another-account-joins-the-network-group">Step 2: Another Account Joins the Network Group<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#step-2-another-account-joins-the-network-group" class="hash-link" aria-label="Direct link to Step 2: Another Account Joins the Network Group" title="Direct link to Step 2: Another Account Joins the Network Group" translate="no">​</a></h3>
<ol>
<li class="">Log in to <strong>Account B</strong> on the other device</li>
<li class="">Go to <strong>Network Group → Join Network Group</strong></li>
<li class="">Enter the network group name created earlier: <code>MyGroup</code></li>
<li class="">Click <strong>Join</strong></li>
</ol>
<p>After successfully joining, Account B's device will also appear in the network group.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260511-154048-0410bd112dc5df876624b63b9adbbd33.png" width="985" height="490" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-verify-connectivity">Step 3: Verify Connectivity<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#step-3-verify-connectivity" class="hash-link" aria-label="Direct link to Step 3: Verify Connectivity" title="Direct link to Step 3: Verify Connectivity" translate="no">​</a></h3>
<p>In the Network Group interface, each device will display a <strong>virtual IP address</strong>. Open the command line and ping the other device's virtual IP:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ping 100.x.x.x</span><br></div></code></pre></div></div>
<p>If the ping succeeds, the network is established and the two devices can access each other.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="frequently-asked-questions">Frequently Asked Questions<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions" translate="no">​</a></h2>
<p><strong>Q1: Do multiple devices under the same account need a Network Group?</strong></p>
<p>No. Devices under the same account are interconnected by default and can connect directly without additional configuration.</p>
<p><strong>Q2: Which ports are allowed?</strong></p>
<p>Currently, after two devices are connected, ports 80, 443, and 3389 are allowed by default. More configurable port options will be added in future updates.</p>
<p><strong>Q3: How do I leave a Network Group?</strong></p>
<p>Click the "Leave" button on the right side of the network group in the list. After leaving, the devices will no longer be able to access each other.</p>
<p><strong>Q4: Is the Network Group secure?</strong></p>
<p>Network Group communication uses end-to-end encryption. Devices within the group can see each other, but outside access is blocked.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="summary">Summary<a href="https://xiaoyeapp.com/blog/2026/05/13/one-click-networking#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<table><thead><tr><th>Scenario</th><th>Solution</th></tr></thead><tbody><tr><td>Same account, multiple devices</td><td>Direct connection, no Network Group needed</td></tr><tr><td>Different accounts, multiple devices</td><td>Create/join a Network Group for one-click networking</td></tr></tbody></table>
<p>The Network Group feature simplifies "cross-account networking" from complex to simple, making it very practical for team collaboration, multi-account households, IT operations, and more.</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
        <item>
            <title><![CDATA[Xiaoye Remote 3.0.1 Released: Easily Build Network Groups Across Accounts]]></title>
            <link>https://xiaoyeapp.com/blog/2026/05/12/v301-published</link>
            <guid>https://xiaoyeapp.com/blog/2026/05/12/v301-published</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to announce that Xiaoye Remote 3.0.1 is officially released! This update brings a major new feature — Network Group — making cross-account device connectivity easier than ever before.]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce that <strong>Xiaoye Remote 3.0.1</strong> is officially released! This update brings a major new feature — <strong>Network Group</strong> — making cross-account device connectivity easier than ever before.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-core-highlight-cross-account-network-groups">🚀 Core Highlight: Cross-Account Network Groups<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-core-highlight-cross-account-network-groups" class="hash-link" aria-label="Direct link to 🚀 Core Highlight: Cross-Account Network Groups" title="Direct link to 🚀 Core Highlight: Cross-Account Network Groups" translate="no">​</a></h3>
<p>In the past, when using remote control software, devices under the same account could connect easily. However, once different accounts were involved, complex configurations, relay servers, or even third-party tools were often required.</p>
<p>Now, Xiaoye Remote Control 3.0.1 completely solves this problem.</p>
<p>A <strong>Network Group</strong> is a virtual device cluster that allows you to add devices from multiple different accounts into the same logical group, enabling direct cross-account connectivity with no additional configuration required.</p>
<!-- -->
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-how-to-use-network-groups">📖 How to Use Network Groups<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-how-to-use-network-groups" class="hash-link" aria-label="Direct link to 📖 How to Use Network Groups" title="Direct link to 📖 How to Use Network Groups" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-create-a-network-group">Step 1: Create a Network Group<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#step-1-create-a-network-group" class="hash-link" aria-label="Direct link to Step 1: Create a Network Group" title="Direct link to Step 1: Create a Network Group" translate="no">​</a></h4>
<p>Log in to Xiaoye Remote Control with Account A, go to <strong>Network Group → Create Network Group</strong>, enter a name (e.g., <code>MyGroup</code>), and click Create.</p>
<blockquote>
<p>💡 Tip: The name only supports letters, numbers, and underscores.</p>
</blockquote>
<p>After successful creation, you can select <strong>"Create and Join"</strong> to automatically add your current device to the network group, or you can manually click the <strong>"Join"</strong> button on the right side of the network group later.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260511-153921-0f09f85f80ba33cada8f529231ededc3.png" width="975" height="558" class="img_ev3q"></p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-invite-other-accounts-to-join">Step 2: Invite Other Accounts to Join<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#step-2-invite-other-accounts-to-join" class="hash-link" aria-label="Direct link to Step 2: Invite Other Accounts to Join" title="Direct link to Step 2: Invite Other Accounts to Join" translate="no">​</a></h4>
<p>Log in to Xiaoye Remote Control with Account B, go to <strong>Network Group → Join Network Group</strong>, enter the network group name created by Account A (e.g., <code>MyGroup</code>), and click Join.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260511-154048-0410bd112dc5df876624b63b9adbbd33.png" width="985" height="490" class="img_ev3q"></p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-test-network-connectivity">Step 3: Test Network Connectivity<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#step-3-test-network-connectivity" class="hash-link" aria-label="Direct link to Step 3: Test Network Connectivity" title="Direct link to Step 3: Test Network Connectivity" translate="no">​</a></h4>
<p>After successfully joining, both devices will be assigned a <strong>virtual IP address</strong>. You can use the <code>ping</code> command to test connectivity:</p>
<p>If the ping succeeds, you can perform remote desktop connections, file transfers, and other operations just like on a local area network.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-same-account-vs-cross-account">⚡ Same Account vs. Cross-Account<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-same-account-vs-cross-account" class="hash-link" aria-label="Direct link to ⚡ Same Account vs. Cross-Account" title="Direct link to ⚡ Same Account vs. Cross-Account" translate="no">​</a></h3>
<table><thead><tr><th>Scenario</th><th>Network Group Required</th><th>Description</th></tr></thead><tbody><tr><td>Same account, multiple devices</td><td>❌ No</td><td>Interconnected by default, ready to use out of the box</td></tr><tr><td>Different accounts, multiple devices</td><td>✅ Yes</td><td>Connect via Network Group</td></tr></tbody></table>
<blockquote>
<p>📌 Note: If you log in to Xiaoye Remote Control on two devices with the same account, they are interconnected by default and <strong>do not require creating a network group</strong>.</p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-use-cases">🎯 Use Cases<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-use-cases" class="hash-link" aria-label="Direct link to 🎯 Use Cases" title="Direct link to 🎯 Use Cases" translate="no">​</a></h3>
<ul>
<li class=""><strong>Team Collaboration</strong> – Multiple team members' devices join the same network group for more efficient remote assistance and file sharing</li>
<li class=""><strong>Multi-Account Households</strong> – Family members use their own accounts while still needing to control each other's devices</li>
<li class=""><strong>IT Operations</strong> – Manage multiple client devices, each with its own account, unified under one network group</li>
<li class=""><strong>Cross-Organization Cooperation</strong> – Temporary networking between partners, easily exit when the task ends</li>
</ul>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-other-updates">🔧 Other Updates<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-other-updates" class="hash-link" aria-label="Direct link to 🔧 Other Updates" title="Direct link to 🔧 Other Updates" translate="no">​</a></h3>
<ul>
<li class="">Optimized remote desktop connection stability</li>
<li class="">Improved UI interaction experience</li>
<li class="">Fixed several known issues</li>
</ul>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-get-started-now">📥 Get Started Now<a href="https://xiaoyeapp.com/blog/2026/05/12/v301-published#-get-started-now" class="hash-link" aria-label="Direct link to 📥 Get Started Now" title="Direct link to 📥 Get Started Now" translate="no">​</a></h3>
<p>Visit the Xiaoye Remote Control official website to download the latest version, or upgrade to 3.0.1 through the in-app update.</p>
<p><strong>Start building your exclusive network group today →</strong></p>]]></content:encoded>
            <category>News</category>
        </item>
        <item>
            <title><![CDATA[Windows Remote Desktop: Why You Should Always Enable NLA]]></title>
            <link>https://xiaoyeapp.com/blog/2026/05/06/force-nla</link>
            <guid>https://xiaoyeapp.com/blog/2026/05/06/force-nla</guid>
            <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In daily Windows server or workstation management, Remote Desktop (RDP) is one of our most commonly used tools. However, many people may overlook a critical security setting — Network Level Authentication (NLA). Today, we'll dive into its principles, effect comparison, and why you should enable it.]]></description>
            <content:encoded><![CDATA[<p>In daily Windows server or workstation management, Remote Desktop (RDP) is one of our most commonly used tools. However, many people may overlook a critical security setting — Network Level Authentication (NLA). Today, we'll dive into its principles, effect comparison, and why you should enable it.</p>
<!-- -->
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-what-is-nla-basic-principles-and-version-support">1. What is NLA? Basic Principles and Version Support<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#1-what-is-nla-basic-principles-and-version-support" class="hash-link" aria-label="Direct link to 1. What is NLA? Basic Principles and Version Support" title="Direct link to 1. What is NLA? Basic Principles and Version Support" translate="no">​</a></h3>
<p><strong>Network Level Authentication (NLA)</strong> is a technology that performs user authentication <strong>before</strong> establishing a full remote desktop connection.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="basic-principle">Basic Principle<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#basic-principle" class="hash-link" aria-label="Direct link to Basic Principle" title="Direct link to Basic Principle" translate="no">​</a></h4>
<p>In traditional mode without NLA, when you initiate an RDP connection, the target computer first allocates desktop session resources, loads the graphical interface, starts the login screen, and only then do you enter your username and password. This is like entering a room first and then being asked to show your ID.</p>
<p>With NLA enabled, at the very beginning of the connection, the client must send your credentials to the server for verification. Only after verification passes will the server start allocating session resources and loading the desktop environment. This is like having a guard at the door — if your ID isn't valid, you can't even enter.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="version-support">Version Support<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#version-support" class="hash-link" aria-label="Direct link to Version Support" title="Direct link to Version Support" translate="no">​</a></h4>
<ul>
<li class=""><strong>Server-side:</strong> Officially supported starting from <strong>Windows Server 2008</strong> and <strong>Windows Vista</strong>.</li>
<li class=""><strong>Client-side:</strong> Supported starting from <strong>Windows XP SP3</strong>, but fully integrated starting from <strong>Windows 7</strong> and later.</li>
</ul>
<p>Mainstream systems like Windows 10/11 and Windows Server 2016/2019/2022/2025 all fully support NLA.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-nla-on-vs-nla-off-effect-comparison">2. NLA On vs. NLA Off: Effect Comparison<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#2-nla-on-vs-nla-off-effect-comparison" class="hash-link" aria-label="Direct link to 2. NLA On vs. NLA Off: Effect Comparison" title="Direct link to 2. NLA On vs. NLA Off: Effect Comparison" translate="no">​</a></h3>
<p>To understand the differences intuitively, I'll compare three dimensions: connection efficiency, visual appearance, and security risks.</p>
<table><thead><tr><th>Behavior</th><th><strong>NLA On</strong></th><th><strong>NLA Off</strong></th></tr></thead><tbody><tr><td><strong>First screen during connection</strong></td><td>Directly displays the standard Windows login window (enter username/password).</td><td>First shows the remote desktop's wallpaper/welcome screen, or even the lock screen, then the login box appears.</td></tr><tr><td><strong>Authentication timing</strong></td><td>Verified immediately after transport layer is established.</td><td>Verified after some system resources have already been consumed (e.g., session memory allocated).</td></tr><tr><td><strong>Server resource consumption</strong></td><td>Low. Failed verification creates no session.</td><td>High. Each attempt (including failed password attacks) creates a full login session, wasting memory and CPU.</td></tr><tr><td><strong>Resilience to brute force attacks</strong></td><td>Strong. Attacks are rejected early.</td><td>Weak. The server is busy creating numerous sessions, easily leading to resource exhaustion and DoS.</td></tr><tr><td><strong>Client compatibility requirements</strong></td><td>Requires RDP client to support NLA (Win XP SP3 and above).</td><td>Any old RDP client (e.g., Win 2000, certain embedded devices) can connect.</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="21-connection-effect-when-nla-is-off-lock-screen-appears-first-then-the-password-prompt">2.1 Connection Effect When NLA is Off: Lock screen appears first, then the password prompt.<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#21-connection-effect-when-nla-is-off-lock-screen-appears-first-then-the-password-prompt" class="hash-link" aria-label="Direct link to 2.1 Connection Effect When NLA is Off: Lock screen appears first, then the password prompt." title="Direct link to 2.1 Connection Effect When NLA is Off: Lock screen appears first, then the password prompt." translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/QQ20260506-214557-16e7f7e31b7ea7ea962d91262c874197.png" width="994" height="564" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="22-connection-effect-when-nla-is-on-windows-login-prompt-appears-directly-no-server-resources-are-consumed-before-password-entry">2.2 Connection Effect When NLA is On: Windows login prompt appears directly, no server resources are consumed before password entry.<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#22-connection-effect-when-nla-is-on-windows-login-prompt-appears-directly-no-server-resources-are-consumed-before-password-entry" class="hash-link" aria-label="Direct link to 2.2 Connection Effect When NLA is On: Windows login prompt appears directly, no server resources are consumed before password entry." title="Direct link to 2.2 Connection Effect When NLA is On: Windows login prompt appears directly, no server resources are consumed before password entry." translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260506-214842-0b209aa2e72d18b0882ef277a2189907.png" width="456" height="452" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="forcing-nla-on-the-server-side">Forcing NLA On the Server Side<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#forcing-nla-on-the-server-side" class="hash-link" aria-label="Direct link to Forcing NLA On the Server Side" title="Direct link to Forcing NLA On the Server Side" translate="no">​</a></h2>
<p>In <strong>System Properties → Remote → Remote Desktop</strong> section, checking "Allow connections only from computers running Remote Desktop with Network Level Authentication" forces NLA on.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260506-211925-dea8a827caa63b880c08e6e99ee1a7df.png" width="412" height="468" class="img_ev3q"></p>
<p>After forcing "NLA-only connections" on the server, clients that do not support NLA will receive a direct connection error, preventing session resource consumption.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="558" height="133" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-summary-for-security-strongly-recommend-enabling-nla">3. Summary: For Security, Strongly Recommend Enabling NLA<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#3-summary-for-security-strongly-recommend-enabling-nla" class="hash-link" aria-label="Direct link to 3. Summary: For Security, Strongly Recommend Enabling NLA" title="Direct link to 3. Summary: For Security, Strongly Recommend Enabling NLA" translate="no">​</a></h3>
<p>From the comparison above, it's clear that disabling NLA, while allowing compatibility with very old systems (such as Windows 2000 or non-standard RDP clients), comes at the cost of serious resource waste and significant security risks.</p>
<p>Especially for remote desktop services exposed to the internet (strongly not recommended to expose port 3389 directly, but if you must), disabling NLA essentially leaves a "backdoor" for attackers to consume your server resources without even needing to authenticate.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="final-recommendations">Final Recommendations<a href="https://xiaoyeapp.com/blog/2026/05/06/force-nla#final-recommendations" class="hash-link" aria-label="Direct link to Final Recommendations" title="Direct link to Final Recommendations" translate="no">​</a></h3>
<p>✅ <strong>Default policy:</strong> On all operating systems that support NLA, make sure to check "Allow connections only from computers running Remote Desktop with Network Level Authentication."</p>
<p>✅ <strong>Compatibility handling:</strong> If old clients cannot connect, consider upgrading the client system, or disable NLA on a case-by-case basis only within isolated internal networks with firewall whitelisting, rather than globally.</p>
<p>✅ <strong>Further hardening:</strong> Even with NLA enabled, it is recommended to use strong passwords, account lockout policies, or non-standard ports (as a secondary measure).</p>
<p><strong>In summary:</strong> Enable NLA — achieve pre-connection authentication and security protection with minimal configuration cost. This is a security best practice every Windows administrator should follow.</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
        <item>
            <title><![CDATA[Say Goodbye to Traditional WinForms: Build Modern Desktop Apps with Glassmorphism Effects Using WinUI 3]]></title>
            <link>https://xiaoyeapp.com/blog/2026/04/24/winui3-layout</link>
            <guid>https://xiaoyeapp.com/blog/2026/04/24/winui3-layout</guid>
            <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction">Introduction<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Remember those WinForms apps we used to build? Gray borders, square buttons, and monotonous interfaces. In this era where visual appeal matters, users have increasingly high expectations for desktop application aesthetics. The emergence of WinUI 3 has finally empowered .NET developers to effortlessly create modern-looking desktop applications.</p>
<p>This article will guide you through building a modern desktop application with glassmorphism effects and a custom title bar using WinUI 3, step by step. The final result will rival native Windows 11 applications.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-why-choose-winui-3">1. Why Choose WinUI 3?<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#1-why-choose-winui-3" class="hash-link" aria-label="Direct link to 1. Why Choose WinUI 3?" title="Direct link to 1. Why Choose WinUI 3?" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>WinForm</th><th>WPF</th><th>WinUI 3</th></tr></thead><tbody><tr><td>Fluent Design</td><td>❌</td><td>Requires 3rd party</td><td>✅ Native</td></tr><tr><td>Mica/Acrylic Material</td><td>❌</td><td>❌</td><td>✅ Native</td></tr><tr><td>Rounded Controls</td><td>Custom required</td><td>Custom required</td><td>✅ Native</td></tr><tr><td>Modern Navigation</td><td>❌</td><td>Requires 3rd party</td><td>NavigationView</td></tr><tr><td>Performance</td><td>Average</td><td>Average</td><td>Excellent</td></tr></tbody></table>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-environment-setup">2. Environment Setup<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#2-environment-setup" class="hash-link" aria-label="Direct link to 2. Environment Setup" title="Direct link to 2. Environment Setup" translate="no">​</a></h2>
<p>Before you begin, ensure you have installed:</p>
<ul>
<li class="">Visual Studio 2022 (17.0+)</li>
<li class="">.NET 6 SDK or higher</li>
<li class="">WinUI 3 project template (available via VS Installer)</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/layout1-a431b9f4e588a878443e436904080988.png" width="563" height="289" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-create-a-project-and-enable-mica-background">3. Create a Project and Enable Mica Background<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#3-create-a-project-and-enable-mica-background" class="hash-link" aria-label="Direct link to 3. Create a Project and Enable Mica Background" title="Direct link to 3. Create a Project and Enable Mica Background" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="31-create-a-new-project">3.1 Create a New Project<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#31-create-a-new-project" class="hash-link" aria-label="Direct link to 3.1 Create a New Project" title="Direct link to 3.1 Create a New Project" translate="no">​</a></h3>
<p>Select the "Blank App, Packaged (WinUI 3 in Desktop)" template.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="32-enable-mica-material">3.2 Enable Mica Material<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#32-enable-mica-material" class="hash-link" aria-label="Direct link to 3.2 Enable Mica Material" title="Direct link to 3.2 Enable Mica Material" translate="no">​</a></h3>
<p>Mica is a semi-transparent material introduced in Windows 11 that dynamically picks up colors from your desktop wallpaper, creating a sense of depth. Simply add the following to your Window object in XAML:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Window.SystemBackdrop</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">MicaBackdrop</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Window.SystemBackdrop</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/layout2-51607854a17dc7716a931192ea63d682.png" width="386" height="293" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-customize-the-title-bar">4. Customize the Title Bar<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#4-customize-the-title-bar" class="hash-link" aria-label="Direct link to 4. Customize the Title Bar" title="Direct link to 4. Customize the Title Bar" translate="no">​</a></h2>
<p>Professional applications typically hide the default title bar, allowing content to extend to the top edge.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="41-create-a-custom-title-bar-in-mainwindowxaml">4.1 Create a Custom Title Bar in MainWindow.xaml<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#41-create-a-custom-title-bar-in-mainwindowxaml" class="hash-link" aria-label="Direct link to 4.1 Create a Custom Title Bar in MainWindow.xaml" title="Direct link to 4.1 Create a Custom Title Bar in MainWindow.xaml" translate="no">​</a></h3>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">x:</span><span class="token tag attr-name" style="color:#00a4db">Name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AppTitleBar</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">Height</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">32</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">VerticalAlignment</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Top</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">Background</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Orange</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">TextBlock</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">x:</span><span class="token tag attr-name" style="color:#00a4db">Name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">TitleTextBlock</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">               </span><span class="token tag attr-name" style="color:#00a4db">Text</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">My WinUI3</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">               </span><span class="token tag attr-name" style="color:#00a4db">Margin</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">12,0,0,0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">               </span><span class="token tag attr-name" style="color:#00a4db">VerticalAlignment</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">               </span><span class="token tag attr-name" style="color:#00a4db">Style</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">{StaticResource CaptionTextBlockStyle}</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="42-set-the-title-bar-drag-region">4.2 Set the Title Bar Drag Region<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#42-set-the-title-bar-drag-region" class="hash-link" aria-label="Direct link to 4.2 Set the Title Bar Drag Region" title="Direct link to 4.2 Set the Title Bar Drag Region" translate="no">​</a></h3>
<p>In your MainWindow.xaml.cs, configure the extension area during initialization:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public MainWindow()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    InitializeComponent();</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    this.ExtendsContentIntoTitleBar = true;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SetTitleBar(AppTitleBar);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>You now have a custom title bar!</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYIAAAElCAIAAABmgXKIAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAJoFJREFUeJztnQl4FFW+t08nYU0gLAKOgOAFRtYQEJDRBJRFRUBAERFwZriCC8x1UFEcfRQZxwV3HNEZQXFGEPSqiCCogLKpfCCyqOAMMBAVLypIAkG2JPX9KxUqle6u6qruWs459XufPFBdVV1ddU6dt/9nqdMZhX/bxkaerShKWVnZjgOnFv/r+JYfTm39oWR/cSkDAAD3ODMrvXOTjNwm1QafW7PdGdXS0tIi5WTQNhKQslvJnVj8Y9+DdzWaPaHWjq7Ntjer9gMDAAD3+O5Uk8+Ptf98V7u+n467p3fDid2zKjSkOkhRhm86mDN0xYyzpreqVsAAAMADKLihvyvqfjS63ru3fj7lo7393ri6Ia3PUJgyc2Nx7Z9XLGkxgQEAgPe0qVFAwhlU8NzMjQMpJsrYfpI9uPrgV+dOZwAA4CNPnTm90+qeF7esnrHkv+rfVfYo6mIAAJ+hmOiuRrMX/+uOjC0/nJpQawcDAADf6Vprx3M/lmRs/aGka7PtDAAAfKdrre1bvyvJ2F9cir55AEAgkHxIQRkMAAACBRoCAAQMNAQA93SayjrdH3/TF/ezL6b5dyYDNrP1Y9mhLdHr6+eynnPYsi7JHZVfDX34FXtjA3tuLAMg7JCD3qjPThZGr69ejw0/5KuGyEG9FrI1w6qYiBykrUwWBxoaPZOt3sE+mcbOblhl/aJNbOIcdvcQNqF/4oNMmKP+a5RLsz+wR0ayMXkVL+euY8+vZB9PZd8fUj/OmueWs4//zeZNjL/GuEwn+cKHbGsBy67NfpvPpgxmAIhErIPMVnoK2Yd0YzSR7qDYEMk2jqOhv61gD11TZQ0VbyrbNrk0h939WuVLCnmIT3ZWaoiWr+iqLtAafaUrTL2S9WjFtu9jV89gbc9iQ85jAADHGE1EpOwg5lRDV5ynhhV3DGL1MyvWbNjNCn9huS3sHqFLS1b0i+qC9k3Vlxv/w3q3qxL10PJff8dcR5cOfS6d7b6fGQAJGLKHZbaMv+noXrboHBZadBMRKTuIOdVQx2as4ABb83VlqX55Dbu5L1u2teKlFuno4dL0xap0jNETVeg6t2Cf76nQ0Dufs6fGsLF/rxAT/Uv79+mgbiLBzXivokpF9cEBndVPIUm1aKS+heKa5KD4a+8B9vBIBkACwiwaf3FcKbuhD3t0SYWGvjmoeuHBEZUaGtpNdYruHc0yUfRqq+5PFS56e+FRVSgUEK3armqI/qXluMz/lD02SrUSme7WuWrjkVO0ti2qP9LpRTVvAQAcYGyT9r9SxsprN6QhClVIH/M/UV/qFTSCVtbLVCtutF5r94kNWy5uz/76vrqwZkeFdC5oo4ppQn+1RZminrhc+5uKAOqmfuyfa1kSaIEVnTlZjDG0DQGQFFFt0lEt1kmRTIf96AvUulibM1UdLJsSvZXqaO9vUwv5GxvU5VhITBSSkA4+2akKiOjVjt21gB06qkYr9wyN/6G//lXFQoqBDH36nYPY6+uhISAU1evF77D3mdh+sdi+M+cko6FrL2CdpqjtRLkt4khhYBfVKX+4hL2zSa2vxYWCoI+2qzvcdYX6kg7SolFFj5sW8tikaQO1ocfIdz+znLMZAFLxxTR1fJDZJj/pOSeObjQT+Tx8kWphv81nDy1i/7zZdOv42eq/xvqakUtz1KFGpB7dYr3bqjU1eosjerVVm4roT+u8o8ogBWgf/CnOns8tZ4O6qh/3zUHVdwNzGQDCoA6Vvp/xgJloyETJOoglPYp6TB5b/XVFl1bcraSDMeNM396lpfovqUenX0f1Lee3dnYapJ7//SN78G01OiM6t1DNGBtPUXWPuPZZVvCTGnBN7G9rpCUAwB8caMg4WJmKurGvyriJ2LlfNYJF9Yqiku+erbKGjBa1pkerysNGHd+4J31K1FadCad1Q7aaAPUAwCvuP1NGocejS9RmYAAAsIPLGnpuudpm9D+Xoh8KAGAXlzWEug8AwCn8TvQBAAgJ0BAAIGCgIQBAwEBDAICAgYYAAAEDDQEAAkbV0InLTzA+ibhwDIUBrkkmk80yNWJjH6FwowR4ihup/MUuvqMh62u0l0VReynmK0HqpFpsYnMiYrLe5tvFJBT2McC3hqwxGsXs9rW3OqGqZLm9kyduMrtQWpSUd5AC7r2j4VVmqBqKCJ3XSqL1Zjoxz/mIyRrFZCuzVz5d2cfnnIpYvoyPna8EgW84Zwjil7j4l0kV0VBE4htDcbg+lkjU/4a3x93k5T6Obms71rVlZrOdQlZXsg/39kmx9usylZUy1EFMiYqCFPNNzN99LMKzBFts7JO6vqUjYZMix/bhuvYbv23ITn0hdChJbfJhHzsN+anvE24itlfyhwD56qCJGuGSkLilP1kQxB1Jw1te2jqfJHvK8PUJhEB26ejwVhadnU9KHfZ28hid38A7LBprZBGQWMUlybP1fNyQdec3g6HAaezcCdZykUU9GqKUBhfOM7Dhi9Ztfnx1JwKPidhYIy9i3dSenC2no6jNhgtCRpyTekQjKaLcs8EEAJxqSCNiY739kc3AUywimkTDm6RErLsvxdEoqcK1huwQsbHJzthAYJMkbCKpgES/fTg6f+E1ZIeIw/U6Tp9h4GEft94LqsJRoU0Krs8/FBpKGmt/WRdgL/Zx6tOUHuYIBbw9Suw6Ypw/NJQ8bhVyyMIvuH6uyg3EOv/Ks82o+hp3O5ASscqnNYJei9VpR0VDjq4QzgJBIWhRTAKhr9TuyadSKVNgIuABKU5uJBZSDtR1fPIptg3Z+TyHs7SCcKGksFVo5JvPKfkz96GJOmFyw0dSgtFaUQh64WEZvogGKdEJeAxuoMh3gQFcEQ8ackQoHwwIGCnbL1JEymsP7KKE05CGK+llcyyxTfEpPu5j8V4j3lWIpCyELJQVSS4uTVANuYKjNkKzliwloH2YjV4kLu4wQVBMlmWFr2sMs4aSw625nVPfh687SShkTTpRrwsaAqFC1IJqifAXBQ0BCQhhmw6T6eqgISAioW0Lk+ka4z/aatFBg25y4DUyFTCnhOra41xsRtXNjn69GBNmAVcIVSGMQrJrt3c5MbZI4gl7i3gYMgo5khWqFLF4jlKOhHJ+FSaGcLdtKGrAi81xLskNFwR+kjDylaNcpY70YyxMLiG18upRE7WjFkSEV4FgkcLSlyWnhLMnTifeZbpaNDnvKbPOfkcpAa/pmLX3haRQ2UeJ9zIMaeVJyGMB5xrSMMt+i9vCrAJoffdYf93Zf7TC631cR+5C5ZQQBoOWF+X9d7cQGtJI7hGw5D4iEu8IiuU3oUU3ouv7ANeRPp1tXGBwVQWBNOQnisP19ndwcR+QOtKns9/Vq+SAhkAIkd4+LPoaOfNOFNAQCAlhUI+GSALSgIaA6Fj4JSK1fQJuV3YRaAiIiE25SOMgJxcilIA0oCHACdIoI3U8Hy7IB9FP2APgHWZz2jKopypi9Gq5QfSVQkPACxIOiQqngBxetYQCYgkn+gDADmYjy8PWXuMICIhZJAI0BKwJ4ZMNqROe6pUZzm4MaAjEBX6xJuTRTdwHIZO/Z6ChVNm46bMR111DC1Nuv/Om62/UVv7txb9Pf+JRWnj9lde6n9fN1Q+0M1VA4okpFi9d8sbCNzt16Dh50u0M2EXyjvNEJP2QUwIcacj6WXAXJ+Vwk9+N//2aj9cycyPoHul1Yf4/Zr3MuGTx0sW3TJ5EC9l1s7es3xQ7Y++9f75v7oJ5tDB4wMBnnphRvq4y5Tdu2jjiupG00KL52ave/3DHv3ZoR6OUOeuss0aNuDaJUzqnfWttYc/2XXF3+N34sadTfoGe8nFXmnGosHDZB8veX/6B9hZWnkfDh101+PJBzG/MS5qEuonC89DYOCW+U+I+ca6YNFsqomjLbWy2rSSY3yM3p7O2UHS4iCTS7tx2UUem6KZiYdm7pzVUeZBNWz7XXgwaMDDqMw4fOcK4ZNWaVZPuvJ2u17iSfER/Gz7b+MB907w/hZCM3zHDv4p5ipUyd2dZNJtLiCUqrrwRO11WxMY+zGJ+j+bNmud07LTtyy9oefPWLeUaqoTEZCyuFN9FBRqfrv9UW+jW9Tz6l94+8YabZ77wPAUX11w1gnHJylUf0UVR9Ddm5Kje+b1pzeq1q+mcaYHivh7dunsWE4XWPoE1CHLSNmTfXNZjT2LX+3z7pFh5ttot/4I8TUPr/9/6qGrU6nVrjS8p9onSkF6puajXRdrC5Em3c94qRPFO06ZNB146gBSsraGLyqpTR2t0e2Phmy5pKJy1Lb66IDjRkFOcaivuS7fmOfQpRyki0GKBNR+vi9q07P1lrLzdRNMNxT43XX+DvpViJW2BdmBCYbwKjfNyu7p3+LAJiC/1GBFUQ8lhVleyyh6tR0kr3lRBoG/gKwYOTqXzi2pMr7z6CqlEq0a1aH52/oX5N/z3OP073wz6UDoBepeheUjlUGGhFiV16tCxsEhdprOllfXr1dN2oEqctnBp/0v0o+lNxXoDc3lTvdqMPeX2O6mm9tqbry94fUHBt9+w8mbv60Zd53aXXzIcPVqsLWTXrZtoX9ulTk7paPCrHiOh0lAsVplEJfn3N4zVSrgGlf+5C+bR3zOPP51EjYAOOPWBqYuXvWtcSeW8wPYxe12Yp73d2Dy07pOK4Ehr99FOeOu2LXr9iypx2kKXzrl2zrP4yJGoC6cPpT87fVte89aihdrClUOGWe7I9ZynHiOGeoyESEN/mf5gvex6sespgoi7/6Q7btWKItVlxl73u8zMrJ27dz765OMko1smT8rN6Zwwfok9oB5V3Xnb5Dat2tDyO+8u1jra6Zh1srJ0d8Slf9/+moaMzUMbPtuoLRjf+9nnm/SXWiWOPjSqYdsMqvrRzhQTUQ1o/w/7n5jxpBYTPfu3mf+YNYf5C8V9xcVHaYES/4UXZ2lnMmbkaMPFhq1uZYZ49tEJkYaMX+8JobqYpgzDMBy1WkTu0GouL7w021GfsX5AKuEfvbdSrzHRMXt0666N4rn/wT+vstSQ3m1vbB7SuuoHl/fE64Vz7SfrtBZovRPNUfg2a+bf9cCHPrTXJReXf2iVup7HVBSqRx6fbrxYqoudPjd5Jv1KGYEFpBEiDTli+crl2sIdt042rtcL5zflX8tJHJDkFVWSSRBaxEF/sX3tRvRue715SLdMz/N7avtoDdW0z7fffUv76w1DJDubp0ofYTwH41iBXbt3uVcvU0zGYVgVqqLDh8dPvPGm8TdWab2WUDrCm8URIdKQWdOG3jRrRA+dtEAgFr0L3Cb6AfWIxkj+hfkF5VUzqnpYl3O92371urWkIb2rXm/3ubT/Jdq5bdm2lQyiNwzlXZBn81TzY/aMW5lNCsWkgJl2F6jVwPItZFW6oidmPFXwzTfTn3hs3/f7fBnB6D/hEpBGiDTkiAKHwY79A8ZtUWratKm2kHBMs9YOzU73ymtd9S2an623++g+2vDZRoqztBoNhTP2K1NZdeowJ5yuqUUPhjA0usWzTyTKPEqVTTFQutEfyfTiy/oWFR2eO//VUSOubde2LZOHMApIAxpKgNkDU07R+tpZ+bd6rIn27dunLTT91VnWxzE0PK/Vu+rzDQOCyEdkJbLe2o/X6lW2fNuhkG0U7VNYRa9c76it+rkxQ01WJVYxRhklql6R78it5CCmdReKraHweicKaCg++lDAVWtWWfde2aRzpxxjXSlq69rTVbzWrVolPNTgAQO1/rIXX35RW9P3oio1R62KR4549bUF2hrtYQg3qIxr8i/MK1ig6mDOKy+rGqravLPsg/e0RQrEbLXd2G7fKSqqeGylTp0sxjWwjF2gofjoLSxPPTujc06usUZDIcau3budjhsaPuwq7YBPzHiSahbGA776+nwtrDDWrSzoeX5PTUNrT48YojM07tCjW3dtEMC2L7dpayzbm5R4Cxajzyu4YuDgueUaonrfvQ9Mve2WW/WLevX1Bffcf6+2PG7sf7OkWLVm9VuLFk67935jWm3c9NnipRUDr+K2sgUN1GMHzEVtjwGXDNBGqVDNYtg1V97+x9vObHLm0aPFK1d9pJVweumoz4i0NfvlF+lodEw64A3Xj48aN0Q89tCjdg6l17D0YU1R7T55VXco78s3m+HAnEiC9d27deuVl7dmnapCqiXRH72k5a1fbCsqOqztk9OpU3JPflHVddKdt9FxyN10ge3btaeV23ds1x00+PKBTsdteQnsYwdMAusQKtjPPzPz5lsmav3o2rgeHQpbsrIynR7z5RfmaKOT6YB6sKCRXTf7gfum2fOa0rxZM71dhvhNz9/om06ffLbexc4q+/ITDfOLxKyJfVl1/dOPPaWOyVxXEZTpCxrkoJdfeIkli1qNXbeOTETq0e2jQb6jKIlxAQRkgd3EgYZMofrRwtfeip12i+prFCslMYqP3rLo9YWLly5ZvnK5/kwZ+YKim2uGj7Dx3V6ZqYMGDNQecyV65+XH5rfer1++fKHVUVMYdENX9I9Zc8qvaAUlkRYEZWfXpVTq37dfKk/AU2rQkakKRtHi2o/XFXzzjVtHdgnYx7pPAXNRVyXh8wcUg5h1h1ExGzXiWuvJCeO+/abrb4h9OlyDilDVUpR4wtZoImzypNvoz2wrMfnW2+jP/KzZP2ZHJ4t6ITt2xt/ZMg1jrsgKR4+D0Cn5+xSb3Vnowo1ispw88muIVxK3AcfBpHIE3MD90iULPk0CC9zCvfmMIBr/gHTiEuQksApKgHMcTYZ7Gumn4eYXeMeCABInSkOK4V+vS0Mqn+KiK+23tNlrvrHzk00Rh+uBO8A+RmLv7eDnorY/rar1PNBmbzcbtOJIKBZz5lusTLiexVxOxMZ8sjHviH0Z4KTYoAoQkJLCVs+x+IEgxWHrRtLXafwgi64K+xUfizO0OaFEzGOWZvtaywXqCR4ISIAUqFopiy5yvl2AWegRzwGmP6Jj84OcxJ/GninFZBMIAAGKFh+IkVCnNZREobI7U1UqmAhIf2nnc6O1pZhvMnlj1MdBQJ5jUVUXo1wFjWCpVK4hp8U7YmONKyQs9sZTjavFiMnOsZvsAAF5i3Xbn2BFyy9kSBaTcUOOmqG9I+kJIiy6ohDR8EhyDY5AkvSxHL4YVWeRo+jKcRVSIUlZ8h150s3eKGoUXeAJ8hQkDwhR4uBhDuARzh/ZBWFNHGgIpI6S1CZgJNQJBQ0BO5h1MYa68LgE0hAaAnHgeuC/RCAlK4CGQkXCLk8UDK9BCscBGgoP1o8To3h4B9I2AdBQSIid7DHguR0kwvlsMKAq0JDQWFSyEt79KB6p43A2GGACNCQcuPV5AGnuFmpKQkOigPueH5AXrlCZjNAQt+Be5w3kiItUSUxoKEAsmjZxxwcOssAL4qcqNBQITmabBAGALHAFu8kYCg0dKC5568uDK3YdWb/3aKmCOyx5MtIi3Ztn5p+TNTK3QZM61ZiE4PZwCwcpKbmGFEV59+uiiW8VHD5ecrJEIQfBQimydMepFf8uemzV/qeGnD28U71IRIJZYHBPuI6zJJVcQ4u+KrrxzT1Fx0pgH7coLVOO0d+pMpI7vbw6pz4TAGS/F7iWqjJrqODQiQdW7IODPIICzL+s+L57s8yWDaozTkHGu4tX6SmzhhZ/Vfifg8fhII+ghN3784lVu4/8vkFDxiPIeHfxMD1l1tCmfb+cKMG96CEnSso+3nvk99051BDy3V28TU+ZNfThrsOlZbgdPYQCopW7DjOOQHa7i0/pKYGGTB/vLIGDvMeXeBP56A+BpXOAGkr9V4esf10PyAEc5A9BpnNQGrKYgivhb8VjAvbwgAxNHevpkGL3CQB3NWQzJHE0BRduxNCCrE8dxfIlL7ilobj1I/vXzGnqAH/BbZA6QqahTQ1ZhzmIYkBy4CZxF1HT046G7LfjAKCDXwHxGYHTM6GGMJU6SALrXwFhuH/cRuz0NGrI5pWIfcFc8e8/99ix/5chz31Jyysm5Rw9WaYtx2XRhI7tzqz96/s2MK6xnkrJbB9gB2nTTdeQtFfIA38e3HJI7hk5TTNp+ZeTZbt+OvaH+TvX7ioy7nNuk9rHTpUxgcFvvaaCnj6c9ql7iqYhma8wcD6d0qXnOXXX7zn8wLsFB46eOiOzWv/29aMcRDT/03omKrh/UkSJtxyJt1VOJHiYg2teGduWHDRy9vbXPvtJX3nf4r0MgAoUh+slBBryliu7NFr59SGjg8wwthOx8pagC1vVbZhZjSpxn/6nqN/T24w7X9Ot0YJx7Z9dte9/FuxiQGBC5BoLoCEPIVnUrp72zraDTt+49d5uDWpnDHv+K6q75bfOPqtelXnF6LAv/bYtHCQysE8VoCEPaVJX1ceiLc40RJbJaZrZ6/EtWvtRVCuS5qAVXx+Cg0QD6jEFGvKcIbkNn/lwn/39R/Vo8t2hE7Ft2EStamkzr22zbV+xRb8+4BI4yApoyEPIPjNGtO7btr4jDVlz7GRZs3o1WjSoWfDzcQbEAA5KADTkLev3HO7Xtj7VpOy0Umts/bb4ipyG+a2zYwOiY6fK+j+9bd0dufSX99gWmChQ7EygAWwBDXnLyFk7SBkv/bbt+LxfaW3VbRrX6tWm3hUzvzSTyH2L94694MxXr2836sUdZCJS2PeFJ3Ul0btIQJvu6frOxI6dH/iMgWCIO4EGnnNKEmjIWzRrPDOyddfmWTNGqD/pdfDoqZ0/Hju7QQ2LWIbesmB8u/duyaldPY32n7/xR2NkRG+cOH8nqe3TKV1+M30zA/6BkeKeAA15DlnDrEXZ+ICYcZneEusX40Goime/lgdSBn7xFmgIAGvgIM+BhgCwAA7yA2gIADPgIJ+AhgDQgXf8R01zaAgA2CcoKlJeZg1lpGFQmefwnchx/YL51LlDZg31a5M9f/MB/Iy9d6SnRS5qncUEA/cDJ1RmhMwaurBl5pvbDh6DhjwjPY11K5/ZFgAbmJZEmTV0Uau6LRrU+PqHYwx4QCTCmmXXuLxtNuMOfPFwiFWmyKyh/2pY/Z6LG93+TsGPv/DcfiEkaRFWvya7t1+TVmfUYFwA9fBMgtyRWUPE1bmNDhcemvr2F8UZ9U+kZymRdAZSI6KUVi87VufUgbv7dhiZ24BxARzEM4lzR3INRSKRcRefO6Bz02eWbl25YfNXBf+HlqJUoCCoY4smfbu0uXFgv3Ma81AdQ3Zyi4OskVxDGk0bZE0fcyGjPwdYJyJ+/I8HkPI+41WCh0JDzrGf3CgJ3hGbthEkeHB4mPLQUCx2kltBkXAbm8kOAsHblIeGokAcBEAUnt/q0JARmCUQkOycEFhGQEMMxSBQkPicEGRGhFBDuO95ALngJ7z/iEh4NIT7PkCQ+AGimL+MmOzjNyHREIqBd8TtVrfeAXiNzTTnJWvCoCFe0lpGFPOV+NEu3xA+kaXXkPA5xDH40S7gDgJpSL+t7bexoSR4BBKWH2TIC1E0hCG2AYKE5RZJskYUDVkjSWbwBxLWfxTLeF/OHBFRQwqaP30ByeszimGBx9E93iGKhqKeI0UJ8RqkcLCEy0SiaAj4CRzkP0q8NWEZgcWhhoyjToDPSHuji0lYsoNDDcUVUFjyw1+QqgGCxK+EQw3FggzzAqRqgCDxqxCIhuw/75tqbimKcuLEiZLS0rKyMlpmoAIkRYA4SPz09PSM9PSaNWsyqfFfQ7HP+5qZyAUHHTt+jEXSsurVTc/IiKShvQkIhaKcOnnq+NGjxUePZmXK/Ou4/mvIzhTO7nxXUxyUlp6eVS8b7d1ASCKRajWqV6tevbiw8Pjx4xLHRD5oKGEVzKsKwqmSEjgICE+E1a5Tp/DAAWgoaeJWwXwaA11WVlatejUGgOBQUC93y2bgbUMeg1AISIDst7GnGpLZ3wAAtxBi3BAAQGa80xBCIQCALVLUkNnzX3AQAMAuKWoIz38BAFLF9UoZHAQAcIaLGoKAAADJ4IqGBBbQe++9t+Prr2+dNMm7j/hi2xedcjoltzUh3377Xc2aNRo1asQAEJbkNCSwd3xm585dTz/zzIuzZyWx1Q73T5t215Qp0BAQmiQ0BAcBANzEkYYkF5BWQevXp++rC+b/+ONPjRs3mnDzhObNm7HysOWR6dMfefjht956a8PGjZmZtXt07zF06NCsLHX6hevHjb96+FWXXXaZ8ThU0Xvq6ae//PIrbQf6NyrqibuVKllLly6lj6DlHt27jx49KisriypuFDQ98vBDWtSzcOHCL7/6qnu3bv/7xpv0kk6M/qWYqE2b1gwAAbGvIckdpLFnz56t27bdc/c9tDxv3rznnn/u4Yce0rfOnTd30MBBN954A1nppTkvZWZmDhs21OJoZCLNX3GrXbFbi4uLH3v8sauuvJI+gpbffnvRrNmzabdOOZ06duzw/vsfjBkzmjy15N2l90+dSn4k8ZHCICAgOvY1FAmDiY4e/UWPcfr06UOOoGKvBUQEBUpagad/hw0Z+vdZs6w15JR169adc845vXv3pmUKgi699JK7/nT3Tz/9REHQmNGjH/jLX84///wl7y6hyEs/JQAkAM+UVYGCDs1BrNw19O/x48f1rcYurfoNGrDyOpSLRqCqHFXTtDqaTmFhUaNyKEr667N/pQW99geAHDjSEH4rNRptJqrMzNpuHfDiiy6imlfcTQ3qq+KjKIkBIBdoG3LAzp279FaY3bt3NW5MockZtEw1KeNuBw4cTO74LVu00BqnY6Gq2awXZ4+/ftyrC+avXr1aq7gBIAcJNQT7VLLk3SVjRo8h9ZCPli5bRrUkbX27tm3pZYcOHamCRo7YsHGDLiYtXDKru0VtzcvL+2jVqrlz5w0dOoSiHvqUQz//3OP8HkxtHZ/Xo3sPqhWOYox81L59e63XjAKx77/fhyZqIDRxNQT1xGf4VcOffOpJrS+fHKSHJHl5+RQB3T9tGiuvVdHf3oICbRP5ZdDAy2kT+eKZGTOiDhi1lcxyx+Q7li5d+sdJt9LWli1bdO/WjRZIbXv27Bk/bhwrb5/q0L4DWUkb+T1m1Oi5r8775ytztb4zBoCARGkodAK6rJzYZY2ojnYq58b+e52srMwxFCaZtOkMK8fsBKK20kfceOMN9Gfcp3c5+kvjVoqVtHAJAHFBTxkAIGCgIQBAwMiuIYXhxzmA8AjZWGLnN+Ir9smIXSUNaWlppSWl6dXSUz9UmzatU3kOHoBUKCk5RTczkxejhmR7XKNaRsax4mL8cCsQnZPHjtHNzEQi7u+kmu4TdW1SmahmzZqffb6pQcOGzVu2qFWrFmQEBENhx4798u3egp8PHszNyWFco6SyQ6xijYVVeCV163re5q1bPnjhgxMnTzAgErH3XsR8k7TUqF4jt3PnLp07Z/AbDbmQHdbXJkNw1KVzLv0l+27hL19M4ia7VF+Q4cDuU6jWGkJmAwAscEcRsRqCekDgxP0WVTDHAwc4Sny7O2c4PzQA/hCJZyIQFB4mPrftXpwQwa3vARZJGol5ifTnn1SjVGjIGpSBYEH6hwJoyAKUAY+w6HpXwtkxLzip5hQ0ZAbKAAgnZs+Cedg/AA3pwDv+EzEJiAC3eNJaBw3hpvcCizHQgGfsPAvmPqHSEIzjD0hnEVHM13s+XCs8GkLZCBCEQhxiv0R4XnZCoiE4CAD7+D1aPSQaAsES28SALwZQCTQE7BPlDkdVLXhHIPzOLGgI2EExWRnXRHgAlTe0vIh9UIZxkk3QEEgFiw5dju7ycKMYFmIzi4un9qAhkJDgb1OQLMGMA3IKNARSRGF4Dp5T7FSlucg4aAjoJH1HcnErA9sZwV1+ya0h7pKbV5BQEpBwFid+c1liDfGb6JyBhAIBI7GGMF4OhAqLFjreb36JNQQSwvvdCUyIOw6IidtXEB4NRcJa6sJ51RIjwDggp4RHQ+LljRuE86qBYEisIZRAxhhG9EhGwuGIQma3fBoSMhu8BCYSCzuZZeyAlyFzRdeQDHkAwGnsO4jJ9AUjroYkyQBfiCC5JELCH9EWV0MASAZHs7L6jLgawjc8EA6bda7Q3djiaogxmAiIhP12n9Dd2IJqKFyZlDJILlHgdD4grxFLQyhOsSBNRCGCzDKDcw0h26xB+vCDnR+qtdPDFcY85VlDYcwPJyB9+MHpTwYg76rAs4YAAKGAZw3hS8MapA//xA2IkGvR8KwhkBDZRtPyitn8PvbfC6yAhiQAYZGnWM/vEzKSvtcsvzE51xAKGACcEVsodTmbFdZIzEJVONcQs3GJACnjKRF0sVdBibdGH/6dFPxrSAeRUVyQJj6A78JyPCuCAmmIhcNE0l8gEA3vG8TE0hBjiIkA8AF/2+KF0xCT3USI/7klTDni6CeIUnaWiBpiLBQxUYTBREGCxPdviIKgGgoJMFFQSJ3sZmaxedEeiElcDaGIAuCciOWmgIqUuBoKA/AscJtUnkvxDGgIhBOzgcDhwOYcJH6litAaQqcSSA6LgcCykPCpZwsT+Y7QGgIgCfClxR2CaigkdxKa4b3ALFXl+hnChBfBU/DHv4akuCcAX5jpJjQ3G08OYgxT4oPwEppgkzPpxMK5hgAAqcG9gxg0xAfh+E7mDiQ7L0BDPoDbnRMkzQgR4h1reNaQuDeNuGcuMZJmivgOYhxrSNKbBgSDpLeTFA5iHGsobgKLcjNJNPxEBuTNCAXRUACI1cMaYTCRt8iYvI60onD6qKpTxNIQADqhd5ARwcOijEa12L4jpU3rpDPgPgiIPAKpKgkkH1JQRrtDhzb/0LhpnVqMR3C3gbhI5/fkYpmI8JWyzftPtqtfltGhW/bm/zsxqDUPGpLrxgIpYXEzGH+aT5x7xiNTCCsgDdJQ+/pKRp9mpaOXF13bIat1gwDbicS5mYAfJPyVVOOvEct18wge3TjiP4Ulj356ZF7/sow29SJ/6FQ6+cOf3x7emAEQPHJpBZhz2/Iikg8pKCMSiYz5demE1cVD34g83qd+oDERADbhb24gt04nNHEQOejQkeLrziuLRNJUDREze5XM/ffhLi/+cmfP7C5n1uhyZnX0nYGksFMQXSlq3AiI2asjKmFRjAX7jpRu3n9q8/4TVBeb2LFkTJfSSCSd/JOhKGqy0dLoNiXnNy758LtTT+2OfF2YfuB46NMMAOAqZ9RU2tYrbV9f+Wef0tbZpJ00zT//H6PS7/Y32vMqAAAAAElFTkSuQmCC" width="386" height="293" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-core-layout-control-practices">5. Core Layout Control Practices<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#5-core-layout-control-practices" class="hash-link" aria-label="Direct link to 5. Core Layout Control Practices" title="Direct link to 5. Core Layout Control Practices" translate="no">​</a></h2>
<p>WinUI 3 provides powerful layout controls. Mastering them is the foundation of building modern UIs.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="51-grid--grid-layout">5.1 Grid — Grid Layout<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#51-grid--grid-layout" class="hash-link" aria-label="Direct link to 5.1 Grid — Grid Layout" title="Direct link to 5.1 Grid — Grid Layout" translate="no">​</a></h3>
<p>Grid is the most commonly used layout control, ideal for building complex interfaces. The example below defines a two-row layout: the first row for a custom title bar and the second row for a navigation bar:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Grid.RowDefinitions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--Title bar content--&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">RowDefinition</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Height</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Auto</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--Navigation bar--&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">RowDefinition</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Height</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">*</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Grid.RowDefinitions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">              </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">x:</span><span class="token tag attr-name" style="color:#00a4db">Name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AppTitleBar</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Grid.Row</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">NavigationView</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">x:</span><span class="token tag attr-name" style="color:#00a4db">Name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AppNavPanel</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Grid.Row</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/layout4-16c54568e08ae3191b34a138150ae8f4.png" width="386" height="293" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="52-stackpanel--simple-stacking">5.2 StackPanel — Simple Stacking<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#52-stackpanel--simple-stacking" class="hash-link" aria-label="Direct link to 5.2 StackPanel — Simple Stacking" title="Direct link to 5.2 StackPanel — Simple Stacking" translate="no">​</a></h3>
<p>StackPanel is used for simple content stacking, either vertically or horizontally. The following example defines a row of horizontally arranged buttons:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">StackPanel</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Grid.Row</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">            </span><span class="token tag attr-name" style="color:#00a4db">Orientation</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Horizontal</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">            </span><span class="token tag attr-name" style="color:#00a4db">Spacing</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">8</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">            </span><span class="token tag attr-name" style="color:#00a4db">HorizontalAlignment</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">New</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Edit</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Delete</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">StackPanel</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="386" height="293" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="53-combination--card-style-list">5.3 Combination — Card-style List<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#53-combination--card-style-list" class="hash-link" aria-label="Direct link to 5.3 Combination — Card-style List" title="Direct link to 5.3 Combination — Card-style List" translate="no">​</a></h3>
<p>By combining Grid and StackPanel, you can create card-style interfaces similar to Windows 11 Settings. To add scrolling capability, simply wrap the content with a ScrollViewer. When the ScrollViewer's content exceeds the window boundaries, a scrollbar will be added automatically.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/layout6-015090ef7a1cd9edcde47be8821688a0.png" width="386" height="293" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="6-conclusion">6. Conclusion<a href="https://xiaoyeapp.com/blog/2026/04/24/winui3-layout#6-conclusion" class="hash-link" aria-label="Direct link to 6. Conclusion" title="Direct link to 6. Conclusion" translate="no">​</a></h2>
<p>WinUI 3 brings an unprecedented modern UI experience to .NET desktop developers. Through this article, you should have learned:</p>
<p>✅ Enable Mica/Acrylic glassmorphism effects</p>
<p>✅ Customize the title bar for a professional look</p>
<p>✅ Build flexible layouts using Grid and StackPanel</p>
<p>✅ Create card-style interfaces</p>
<p>✅ Implement responsive window adaptation</p>
<p>Compared to traditional WinForms, WinUI 3 offers both ease of use and advanced, powerful features. While the advanced features may be complex, the improvements in visual experience and user interaction are tremendous. If you're looking to build an impressive desktop application in 2026, WinUI 3 is an excellent choice.</p>]]></content:encoded>
            <category>WinUI</category>
        </item>
        <item>
            <title><![CDATA[Redirect Your Drives in Windows Remote Desktop]]></title>
            <link>https://xiaoyeapp.com/blog/2026/04/12/driver-redirection</link>
            <guid>https://xiaoyeapp.com/blog/2026/04/12/driver-redirection</guid>
            <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Category 4/12/2026]]></description>
            <content:encoded><![CDATA[<p>Category: Windows Remote Published: 4/12/2026</p>
<p>In our daily work, we often need to copy files from our local computer to a remote server or office computer. The traditional approach involves network sharing, FTP, or cloud storage transfers, but these methods are either complex to configure or limited by speed.</p>
<p>Today, I'd like to share a practical feature of Windows Remote Desktop that is easy to overlook: <strong>Drive Redirection</strong>. Once configured, your local hard drive partitions will appear directly in "This PC" on the remote desktop, allowing you to copy files as simply as you would on your local machine.</p>
<!-- -->
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="steps">Steps<a href="https://xiaoyeapp.com/blog/2026/04/12/driver-redirection#steps" class="hash-link" aria-label="Direct link to Steps" title="Direct link to Steps" translate="no">​</a></h3>
<p><strong>Step 1: Open Remote Desktop Connection</strong></p>
<p>Press <code>Win + R</code>, type <code>mstsc</code>, and press Enter to open the Remote Desktop Connection client.</p>
<p><strong>Step 2: Access Local Resources Settings</strong></p>
<p>In the Remote Desktop Connection window, click on <strong>"Show Options"</strong> in the bottom-left corner, then switch to the <strong>"Local Resources"</strong> tab.</p>
<p><strong>Step 3: Configure Drive Mapping</strong></p>
<p>In the "Local Resources" tab, click the <strong>"More..."</strong> button.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260412-200427-a8d6546d232656080d13f83baa293c02.png" width="485" height="562" class="img_ev3q"></p>
<p><strong>Step 4: Select the Drives to Map</strong></p>
<p>In the pop-up window, expand the <strong>"Drives"</strong> list and check the local disk partitions you wish to map to the remote desktop.</p>
<ul>
<li class="">Checking the <strong>"Drives"</strong> checkbox selects all partitions</li>
<li class="">Alternatively, you can select individual drives such as C: or D: as needed</li>
<li class="">Click <strong>"OK"</strong> to confirm</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260412-200513-805ae2c353e5aed62cb6424d6de1f857.png" width="488" height="433" class="img_ev3q"></p>
<p><strong>Step 5: Connect to the Remote Desktop</strong></p>
<p>Enter the remote computer's IP address and credentials as usual to connect to the remote desktop.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="final-result">Final Result<a href="https://xiaoyeapp.com/blog/2026/04/12/driver-redirection#final-result" class="hash-link" aria-label="Direct link to Final Result" title="Direct link to Final Result" translate="no">​</a></h3>
<p>Once connected, open <strong>"This PC"</strong> in the remote desktop window. Under the <strong>"Redirected Drives and Folders"</strong> section, you will see the local drive letters you checked earlier.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260412-200906-befa756392e20cf79fc0d98de31bc945.png" width="601" height="425" class="img_ev3q"></p>
<p>Now, you can drag, copy, and paste files directly between the remote computer and your local drives, just as you would on your local machine—no intermediate tools required.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="important-notes">Important Notes<a href="https://xiaoyeapp.com/blog/2026/04/12/driver-redirection#important-notes" class="hash-link" aria-label="Direct link to Important Notes" title="Direct link to Important Notes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Network and Policy Restrictions</strong>: In some corporate environments, IT administrators may disable drive redirection via Group Policy. In such cases, this option may be unavailable or ineffective.</li>
<li class=""><strong>Security Recommendations</strong>: Only use this feature on remote computers you trust. Enabling this option on public or untrusted remote computers may lead to local data leakage.</li>
<li class=""><strong>Performance Considerations</strong>: When reading or writing files to a mapped drive over a remote desktop session, data is transmitted over the network. The speed of copying large files is limited by your available network bandwidth.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://xiaoyeapp.com/blog/2026/04/12/driver-redirection#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h3>
<p>This little tip saves you the intermediate steps of setting up file sharing or uploading to cloud storage. It significantly improves efficiency, especially when you need to temporarily transfer a few files to a server.</p>
<p>If you frequently use Remote Desktop for work, give this feature a try.</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
        <item>
            <title><![CDATA[WinUI 3 Exception Handling: Building Robust Desktop Applications]]></title>
            <link>https://xiaoyeapp.com/blog/2026/04/07/winui3-exception</link>
            <guid>https://xiaoyeapp.com/blog/2026/04/07/winui3-exception</guid>
            <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction">Introduction<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Any application is bound to encounter exceptions—network disconnections, missing files, null references, out-of-memory conditions... The key is <strong>how to handle these exceptions gracefully</strong> rather than letting the application crash directly.</p>
<p>As a next-generation Windows desktop application framework, WinUI 3 provides a multi-level exception handling mechanism. This article will detail common exception handling approaches in WinUI 3 to help you build more robust applications.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-exception-handling-hierarchy">1. Exception Handling Hierarchy<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#1-exception-handling-hierarchy" class="hash-link" aria-label="Direct link to 1. Exception Handling Hierarchy" title="Direct link to 1. Exception Handling Hierarchy" translate="no">​</a></h2>
<p>Exceptions in WinUI 3 applications can be caught at different levels:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">App Layer (UnhandledException)              ← Outermost layer, fallback</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Page/Window Layer (try-catch)               ← UI layer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ViewModel/Service Layer                     ← Business logic layer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">async/Task Exceptions (TaskScheduler.UnobservedTaskException) ← Async tasks</span><br></div></code></pre></div></div>
<p>Due to space constraints, this article covers the most basic and commonly used exception handling methods.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-applicationcurrentunhandledexception">2. Application.Current.UnhandledException<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#2-applicationcurrentunhandledexception" class="hash-link" aria-label="Direct link to 2. Application.Current.UnhandledException" title="Direct link to 2. Application.Current.UnhandledException" translate="no">​</a></h2>
<p>This is the <strong>most critical global exception handling entry point</strong> in WinUI 3 applications. Any uncaught exception will eventually reach here.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="basic-usage">Basic Usage<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#basic-usage" class="hash-link" aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate="no">​</a></h3>
<p>In <code>App.xaml.cs</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public partial class App : Application {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    public App()    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        this.InitializeComponent();       </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        this.UnhandledException += OnAppUnhandledException;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }   </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    private void OnAppUnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e)  {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        e.Handled = true;       </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(e.Exception, "UnhandledException");       </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ShowErrorDialog("The application encountered an issue and has attempted to recover.");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="key-points">Key Points<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#key-points" class="hash-link" aria-label="Direct link to Key Points" title="Direct link to Key Points" translate="no">​</a></h3>
<table><thead><tr><th>Property/Method</th><th>Description</th></tr></thead><tbody><tr><td><code>e.Exception</code></td><td>Gets the exception object, containing stack trace and other information</td></tr><tr><td><code>e.Handled = true</code></td><td>Marks the exception as handled; the application will not crash</td></tr><tr><td><code>e.Handled = false</code></td><td>Marks the exception as unhandled; the application will terminate</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="️-important-note">⚠️ Important Note<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#%EF%B8%8F-important-note" class="hash-link" aria-label="Direct link to ⚠️ Important Note" title="Direct link to ⚠️ Important Note" translate="no">​</a></h3>
<p><strong>UnhandledException can only catch exceptions on the UI thread!</strong> Exceptions in background threads and async tasks require other handling methods.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-taskschedulerunobservedtaskexception">3. TaskScheduler.UnobservedTaskException<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#3-taskschedulerunobservedtaskexception" class="hash-link" aria-label="Direct link to 3. TaskScheduler.UnobservedTaskException" title="Direct link to 3. TaskScheduler.UnobservedTaskException" translate="no">​</a></h2>
<p>Handles <strong>unobserved exceptions in async/await tasks</strong>. Triggered when a Task is garbage collected and an exception remains unobserved.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="usage">Usage<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">public App() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    this.InitializeComponent(); </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    this.UnhandledException += OnAppUnhandledException;   </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    TaskScheduler.UnobservedTaskException += OnTaskUnobservedException;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">private void OnTaskUnobservedException(object sender, UnobservedTaskExceptionEventArgs e) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    e.SetObserved();  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    LogException(e.Exception, "UnobservedTaskException"); </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="practical-example">Practical Example<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#practical-example" class="hash-link" aria-label="Direct link to Practical Example" title="Direct link to Practical Example" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">async Task DangerousMethod() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    await Task.Run(() =&gt; {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        throw new InvalidOperationException("Background operation failed");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    });</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">_ = DangerousMethod();  </span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="best-practice">Best Practice<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#best-practice" class="hash-link" aria-label="Direct link to Best Practice" title="Direct link to Best Practice" translate="no">​</a></h3>
<p>Always wrap async operations with <code>try-catch</code>, or use <code>await</code> + <code>try-catch</code> to properly handle exceptions.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-scenario-specific-exception-handling">4. Scenario-Specific Exception Handling<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#4-scenario-specific-exception-handling" class="hash-link" aria-label="Direct link to 4. Scenario-Specific Exception Handling" title="Direct link to 4. Scenario-Specific Exception Handling" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="file-io-operations">File I/O Operations<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#file-io-operations" class="hash-link" aria-label="Direct link to File I/O Operations" title="Direct link to File I/O Operations" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">private async Task LoadFileAsync(string filePath) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        var file = await StorageFile.GetFileFromPathAsync(filePath);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        var content = await FileIO.ReadTextAsync(file);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    catch (FileNotFoundException ex) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        await ShowErrorDialog($"File not found: {filePath}");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(ex, "FileNotFound");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    catch (UnauthorizedAccessException ex) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        await ShowErrorDialog("No permission to access the file");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(ex, "UnauthorizedAccess");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    catch (Exception ex) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        await ShowErrorDialog($"Failed to read file: {ex.Message}");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(ex, "FileIOError");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="network-request-exceptions">Network Request Exceptions<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#network-request-exceptions" class="hash-link" aria-label="Direct link to Network Request Exceptions" title="Direct link to Network Request Exceptions" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">private async Task&lt;HttpResponseMessage&gt; SendRequestAsync(string url) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        using var client = new HttpClient();</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        client.Timeout = TimeSpan.FromSeconds(30);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        return await client.GetAsync(url);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    catch (HttpRequestException ex) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(ex, "NetworkError");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        throw new NetworkException("Network connection failed, please check your network settings", ex);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    catch (TaskCanceledException ex) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        LogException(ex, "RequestTimeout");</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        throw new TimeoutException("Request timeout, please try again later", ex);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-exception-handling-practices-in-xiaoye-remote">5. Exception Handling Practices in Xiaoye Remote<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#5-exception-handling-practices-in-xiaoye-remote" class="hash-link" aria-label="Direct link to 5. Exception Handling Practices in Xiaoye Remote" title="Direct link to 5. Exception Handling Practices in Xiaoye Remote" translate="no">​</a></h2>
<p>In actual development, exception handling is not only about preventing crashes but also about <strong>helping developers quickly locate issues</strong>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="one-click-feedback">One-Click Feedback<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#one-click-feedback" class="hash-link" aria-label="Direct link to One-Click Feedback" title="Direct link to One-Click Feedback" translate="no">​</a></h3>
<p>In Xiaoye Remote, we have designed a convenient exception feedback mechanism:</p>
<p><strong>If you encounter an exception while using Xiaoye Remote, simply click the one-click feedback button on the exception interface to report the error information to us. The error information does not contain any personal data.</strong></p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260329-173244-e5b60beac711c1b9814555eb91e5589b.png" width="931" height="504" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="feature-highlights">Feature Highlights<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#feature-highlights" class="hash-link" aria-label="Direct link to Feature Highlights" title="Direct link to Feature Highlights" translate="no">​</a></h3>
<table><thead><tr><th>Feature</th><th>Description</th></tr></thead><tbody><tr><td>🔒 <strong>Data Security</strong></td><td>Only collects exception stack traces and system environment information, contains no user data</td></tr><tr><td>⚡ <strong>One-Click Operation</strong></td><td>No forms to fill out, feedback can be submitted with a single click</td></tr><tr><td>🔄 <strong>Real-Time Notification</strong></td><td>Developers can receive exception reports promptly and fix them</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="6-best-practices-summary">6. Best Practices Summary<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#6-best-practices-summary" class="hash-link" aria-label="Direct link to 6. Best Practices Summary" title="Direct link to 6. Best Practices Summary" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-do-recommended-practices">✅ DO (Recommended Practices)<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#-do-recommended-practices" class="hash-link" aria-label="Direct link to ✅ DO (Recommended Practices)" title="Direct link to ✅ DO (Recommended Practices)" translate="no">​</a></h3>
<ul>
<li class="">Always set up <code>UnhandledException</code> as the outermost fallback</li>
<li class="">Log detailed exception information (type, stack trace, time, context)</li>
<li class="">Provide user-friendly prompts, avoid showing overly technical log details</li>
<li class="">Handle specific exceptions at appropriate layers (e.g., network, file operations)</li>
<li class="">Provide exception feedback channels to allow users to help improve the application</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-dont-practices-to-avoid">❌ DON'T (Practices to Avoid)<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#-dont-practices-to-avoid" class="hash-link" aria-label="Direct link to ❌ DON'T (Practices to Avoid)" title="Direct link to ❌ DON'T (Practices to Avoid)" translate="no">​</a></h3>
<ul>
<li class="">Don't swallow exceptions without logging them (<code>e.Handled = true</code> without any action)</li>
<li class="">Don't perform long-running operations on the UI thread (use async/await)</li>
<li class="">Don't ignore Task exceptions (use try-catch or await)</li>
<li class="">Don't throw the same exception in a catch block (loses stack trace information)</li>
<li class="">Don't display complete exception stack traces to users in production</li>
</ul>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://xiaoyeapp.com/blog/2026/04/07/winui3-exception#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Exception handling is an <strong>indispensable foundation</strong> in desktop application development. WinUI 3 provides a comprehensive exception handling mechanism. Properly utilizing these mechanisms can make your applications more robust and your users more satisfied.</p>
<p>Remember: <strong>Good exception handling doesn't mean the application never reports errors—it means when errors occur, the application can degrade gracefully, log the issue, and help users recover their operations.</strong></p>
<hr>
<p><em>If you encounter any issues while using Xiaoye Remote, please feel free to report them to us through the one-click feedback feature on the exception interface, helping us make the product better!</em></p>]]></content:encoded>
            <category>WinUI</category>
        </item>
        <item>
            <title><![CDATA[Windows Desktop Development: Introduction to WinUI 3]]></title>
            <link>https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3</link>
            <guid>https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction">Introduction<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>As a Windows desktop developer, have you ever been confused about how many UI frameworks Microsoft actually has? Win32, MFC, WinForms, WPF, UWP, WinUI… these terms can be overwhelming. Today, we'll sort through the evolution of Windows UI frameworks and focus on Microsoft's current flagship—WinUI 3—to help you take your first step into modern Windows desktop development.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-three-generations-of-windows-ui-frameworks">1. Three Generations of Windows UI Frameworks<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#1-three-generations-of-windows-ui-frameworks" class="hash-link" aria-label="Direct link to 1. Three Generations of Windows UI Frameworks" title="Direct link to 1. Three Generations of Windows UI Frameworks" translate="no">​</a></h2>
<p>Looking back at the history of Windows desktop development, we can roughly divide these frameworks into three stages:</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="first-generation-the-native-era--win32--mfc">First Generation: The Native Era — Win32 / MFC<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#first-generation-the-native-era--win32--mfc" class="hash-link" aria-label="Direct link to First Generation: The Native Era — Win32 / MFC" title="Direct link to First Generation: The Native Era — Win32 / MFC" translate="no">​</a></h3>
<p><strong>Win32 API</strong> is the lowest-level interface for Windows UI programming, allowing direct interaction with the operating system. When developing desktop applications with Win32, you need to manually handle window messages (WM_PAINT, WM_CLOSE, etc.) and manage handles and resources. The advantages are extremely high performance and strong control, but the downside is low development efficiency—even creating a single button requires dozens of lines of code.</p>
<p><strong>MFC (Microsoft Foundation Classes)</strong> is a C++ wrapper around Win32 that abstracts windows and controls into C++ classes, simplifying the development process. From the 1990s to the early 2000s, MFC was the mainstream choice for Windows desktop development. However, due to its dependence on C++ complexity and legacy issues, it has gradually faded from the scene.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/win32mfc-f565a355dc753cccbc25791e44236a57.png" width="852" height="476" class="img_ev3q"></p>
<blockquote>
<p><strong>Characteristics:</strong> Low-level, high performance, low development efficiency, rarely used in modern development</p>
</blockquote>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="second-generation-the-managed-era--winforms--wpf">Second Generation: The Managed Era — WinForms / WPF<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#second-generation-the-managed-era--winforms--wpf" class="hash-link" aria-label="Direct link to Second Generation: The Managed Era — WinForms / WPF" title="Direct link to Second Generation: The Managed Era — WinForms / WPF" translate="no">​</a></h3>
<p>With the introduction of the .NET Framework, Microsoft launched two major managed UI frameworks:</p>
<p><strong>WinForms</strong> was released in 2002 with .NET Framework 1.0. It adopts a "what you see is what you get" design philosophy, making drag-and-drop development extremely intuitive and code simple to understand. For traditional business system development (such as inventory management, ERP), WinForms still has a wide user base today.</p>
<p><strong>WPF (Windows Presentation Foundation)</strong> was released in 2006, bringing revolutionary changes: XAML declarative UI, vector graphics, data binding, and the MVVM pattern. WPF separates the interface from logic, achieving true "UI and code decoupling." Numerous enterprise applications still run on WPF today.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/winformwpf-381d835b530e3f4f38cfdefe24ca6352.png" width="786" height="443" class="img_ev3q"></p>
<blockquote>
<p><strong>Characteristics:</strong> Managed code, high development efficiency, mature ecosystem, WPF suitable for complex interface development</p>
</blockquote>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="third-generation-the-modern-era--winrt--uwp--winui">Third Generation: The Modern Era — WinRT / UWP / WinUI<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#third-generation-the-modern-era--winrt--uwp--winui" class="hash-link" aria-label="Direct link to Third Generation: The Modern Era — WinRT / UWP / WinUI" title="Direct link to Third Generation: The Modern Era — WinRT / UWP / WinUI" translate="no">​</a></h3>
<p><strong>WinRT (Windows Runtime)</strong> was introduced with Windows 8, designed for touchscreens and the Metro style, introducing a new application model and API design.</p>
<p><strong>UWP (Universal Windows Platform)</strong> is an evolution of WinRT, with the slogan "develop once, run on multiple platforms" (PC, Xbox, HoloLens, etc.). UWP supports modern UI features (such as acrylic effects, fluid animations), but due to mandatory distribution through the Microsoft Store and API restrictions, developer adoption has been limited.</p>
<p><strong>WinUI 3</strong> is Microsoft's latest native UI framework, which can be seen as the "unbundled" version of UWP—it separates the modern UI control library from UWP, no longer requires Store distribution, and allows developers to use full Windows APIs. WinUI 3 is currently Microsoft's <strong>only heavily invested</strong> desktop UI framework.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/winui3-44de3b4e12c173dc155799cbc4b23a55.png" width="686" height="443" class="img_ev3q"></p>
<blockquote>
<p><strong>Characteristics:</strong> Modern UI, fully native, no distribution restrictions, Microsoft's current strategic direction</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-why-choose-winui-3">2. Why Choose WinUI 3?<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#2-why-choose-winui-3" class="hash-link" aria-label="Direct link to 2. Why Choose WinUI 3?" title="Direct link to 2. Why Choose WinUI 3?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-official-strategic-direction">1. Official Strategic Direction<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#1-official-strategic-direction" class="hash-link" aria-label="Direct link to 1. Official Strategic Direction" title="Direct link to 1. Official Strategic Direction" translate="no">​</a></h3>
<p>From Microsoft's official statements and version iterations, WinUI 3 has become the primary framework for Windows desktop development. While WinForms and WPF will continue to be maintained, new features are rarely added; WinUI 3, however, continues to evolve and tightly integrates with Windows 11's new features.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-modern-ui-experience">2. Modern UI Experience<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#2-modern-ui-experience" class="hash-link" aria-label="Direct link to 2. Modern UI Experience" title="Direct link to 2. Modern UI Experience" translate="no">​</a></h3>
<p>WinUI 3 comes with Fluent Design built-in, giving your applications:</p>
<ul>
<li class=""><strong>Mica</strong> and <strong>Acrylic</strong> effects: Frosted glass-like textures</li>
<li class=""><strong>Rounded corners and animations</strong>: Aligned with Windows 11's design language</li>
<li class=""><strong>Dark/Light theme auto-adaptation</strong>: No additional code required</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-full-api-access">3. Full API Access<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#3-full-api-access" class="hash-link" aria-label="Direct link to 3. Full API Access" title="Direct link to 3. Full API Access" translate="no">​</a></h3>
<p>Unlike UWP, WinUI 3 applications can call <strong>all Windows APIs</strong> (including registry, system services, any file system location, etc.) without sandbox restrictions. This means you can smoothly migrate powerful features from existing Win32/WPF applications to a modern UI.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-multiple-distribution-methods">4. Multiple Distribution Methods<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#4-multiple-distribution-methods" class="hash-link" aria-label="Direct link to 4. Multiple Distribution Methods" title="Direct link to 4. Multiple Distribution Methods" translate="no">​</a></h3>
<p>WinUI 3 applications can:</p>
<ul>
<li class="">Run directly as .exe files</li>
<li class="">Be packaged as MSIX for distribution through the Microsoft Store</li>
<li class="">Be distributed through other installer tools</li>
</ul>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-creating-your-first-winui-3-application">3. Creating Your First WinUI 3 Application<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#3-creating-your-first-winui-3-application" class="hash-link" aria-label="Direct link to 3. Creating Your First WinUI 3 Application" title="Direct link to 3. Creating Your First WinUI 3 Application" translate="no">​</a></h2>
<p>Now that we've covered the theory, let's get hands-on and create a simple WinUI 3 application.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-create-the-project">Step 1: Create the Project<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#step-1-create-the-project" class="hash-link" aria-label="Direct link to Step 1: Create the Project" title="Direct link to Step 1: Create the Project" translate="no">​</a></h3>
<ol>
<li class="">Open Visual Studio 2022 and click "Create a new project"</li>
<li class="">Enter "WinUI" in the template search box and select <strong>"Blank App, Packaged (WinUI 3)"</strong></li>
<li class="">Click "Create," enter a project name such as "Xiaoye Remote," and you'll have a standard WinUI 3 project created</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/ScreenShot_2026-03-30_202235_169-b6c1f78fd582884c34a24632644eeebe.png" width="894" height="528" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-understand-the-project-structure">Step 2: Understand the Project Structure<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#step-2-understand-the-project-structure" class="hash-link" aria-label="Direct link to Step 2: Understand the Project Structure" title="Direct link to Step 2: Understand the Project Structure" translate="no">​</a></h3>
<p>After creation, you'll see the following structure:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">├── App.xaml                 # Application entry point, defines startup window and global resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── App.xaml.cs              # Code-behind for App.xaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── MainWindow.xaml          # Main window interface</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── MainWindow.xaml.cs       # Code-behind for the main window</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── Package.appxmanifest     # Packaging configuration file (icons, permissions, etc.)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── (Other project files)</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-design-a-simple-interface">Step 3: Design a Simple Interface<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#step-3-design-a-simple-interface" class="hash-link" aria-label="Direct link to Step 3: Design a Simple Interface" title="Direct link to Step 3: Design a Simple Interface" translate="no">​</a></h3>
<p>Open <code>MainWindow.xaml</code> and replace the content between <code>&lt;Grid&gt;&lt;/Grid&gt;</code> with the following code:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Background</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">#20b2aa</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">TextBlock</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">Foreground</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">White</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">HorizontalAlignment</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">VerticalAlignment</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">FontSize</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">50</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Hello World</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">TextBlock</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Grid</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-4-run-the-application">Step 4: Run the Application<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#step-4-run-the-application" class="hash-link" aria-label="Direct link to Step 4: Run the Application" title="Direct link to Step 4: Run the Application" translate="no">​</a></h3>
<p>Press <strong>F5</strong> to start debugging, and you'll see a basic window:</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="686" height="443" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://xiaoyeapp.com/blog/2026/03/30/first-look-at-winui3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As Microsoft's new generation flagship framework for desktop development, WinUI 3 inherits the excellent design concepts of WPF, integrates the modern UI experience of UWP, while removing distribution restrictions. For Windows developers, now is the perfect time to learn WinUI 3—Microsoft is fully committed to it, and the ecosystem is continuously improving.</p>
<p>I hope this article helps you understand the evolution of Windows UI frameworks and successfully run your first WinUI 3 application!</p>]]></content:encoded>
            <category>WinUI</category>
        </item>
        <item>
            <title><![CDATA[Elegantly Adjust Your Remote Desktop Display: From Fixed Resolution to Auto-Adaptation]]></title>
            <link>https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution</link>
            <guid>https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution</guid>
            <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[If you've ever used remote desktop software, you've likely encountered this scenario: you try to enlarge the window, and the image becomes blurry; or you want to fill the screen, but you have to set the resolution in advance, and once connected, it can't be changed. This isn't a flaw in any particular software—it's the result of the three long-standing display modes in Windows Remote Desktop, each with its own design logic.]]></description>
            <content:encoded><![CDATA[<p>If you've ever used remote desktop software, you've likely encountered this scenario: you try to enlarge the window, and the image becomes blurry; or you want to fill the screen, but you have to set the resolution in advance, and once connected, it can't be changed. This isn't a flaw in any particular software—it's the result of the three long-standing display modes in Windows Remote Desktop, each with its own design logic.</p>
<!-- -->
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-full-screen-mode">1. Full-Screen Mode<a href="https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution#1-full-screen-mode" class="hash-link" aria-label="Direct link to 1. Full-Screen Mode" title="Direct link to 1. Full-Screen Mode" translate="no">​</a></h3>
<p><strong>Design Concept</strong></p>
<p>This is the most intuitive approach. Entering full-screen mode makes the remote desktop instantly fill your entire display, hiding the title bar, borders, and taskbar, leaving only the remote computer's desktop. It feels as if you're sitting right in front of that machine, with your view completely taken over.</p>
<p>In full-screen mode, the remote window typically occupies the current display, locking the mouse inside. To switch back to a local application—say, to check a message or reply on WeChat—you need to press a keyboard shortcut to exit full-screen mode.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-fullscreen7868609-0-c39348b7cef4bcf2f366da647d60685c.png" width="771" height="439" class="img_ev3q"></p>
<p><strong>User Experience</strong></p>
<ul>
<li class="">Strongest immersion, ideal for extended focused work</li>
<li class="">Maximised screen utilisation, unaffected by local window layouts</li>
<li class="">On multi-monitor setups, full-screen usually takes over the current display, with the mouse confined to it</li>
</ul>
<p><strong>Best For</strong></p>
<p>Scenarios where you need to "live" inside the remote computer without interruptions from local tasks.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-fixed-resolution-mode">2. Fixed Resolution Mode<a href="https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution#2-fixed-resolution-mode" class="hash-link" aria-label="Direct link to 2. Fixed Resolution Mode" title="Direct link to 2. Fixed Resolution Mode" translate="no">​</a></h3>
<p><strong>Design Concept</strong></p>
<p>This is the more traditional approach. Before connecting, you specify the resolution you want—for example, 800×600. The remote host then outputs exactly that resolution, and the client displays it pixel-for-pixel.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260327-091139-72fe9fd67834cff916796608bc54837d.png" width="436" height="505" class="img_ev3q"></p>
<p><strong>User Experience</strong></p>
<ul>
<li class="">Crystal-clear visuals, with pixel-perfect rendering</li>
<li class="">Stable layout, independent of the local window size</li>
<li class="">After connecting, the window itself has a maximum size limit—you cannot drag it beyond the pre-set resolution</li>
</ul>
<p><strong>Best For</strong></p>
<p>Situations where image quality matters and the window size remains relatively fixed, such as remote debugging or reviewing design drafts.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-scaling-mode">3. Scaling Mode<a href="https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution#3-scaling-mode" class="hash-link" aria-label="Direct link to 3. Scaling Mode" title="Direct link to 3. Scaling Mode" translate="no">​</a></h3>
<p><strong>Design Concept</strong></p>
<p>No matter how large or small you drag the window, the remote desktop content scales proportionally to fill it. This is achieved through interpolation algorithms: when the window grows, the content is "stretched"; when it shrinks, the content is "compressed". As a result, the display always fits the window, but text edges become less sharp, and icon details degrade slightly. On a 4K screen, shrinking a remote window can make text difficult to read.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/Adaptive-scaling9879878960-f96f7fd30d4d42be82d9b271fc2c1b48.png" width="827" height="581" class="img_ev3q"></p>
<p><strong>User Experience</strong></p>
<ul>
<li class="">Window can be resized arbitrarily; content always fits proportionally</li>
<li class="">Extremely adaptable—works with any window shape or size</li>
<li class="">Scaling affects sharpness; text and icons are less crisp than in fixed-resolution mode</li>
</ul>
<p><strong>Best For</strong></p>
<p>Everyday office work and tasks where the window size changes frequently and absolute sharpness isn't critical.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-trade-offs-among-the-three-modes">4. Trade-offs Among the Three Modes<a href="https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution#4-trade-offs-among-the-three-modes" class="hash-link" aria-label="Direct link to 4. Trade-offs Among the Three Modes" title="Direct link to 4. Trade-offs Among the Three Modes" translate="no">​</a></h3>
<p>From a design perspective, these three modes cater to different usage habits:</p>
<table><thead><tr><th>Mode</th><th>Core Value</th><th>Characteristics</th></tr></thead><tbody><tr><td>Full-Screen</td><td>Immersion</td><td>Occupies the entire display; strong focus</td></tr><tr><td>Fixed Resolution</td><td>Clarity</td><td>Pixel-perfect; stable visuals</td></tr><tr><td>Scaling</td><td>Flexibility</td><td>Adapts to window size; natural interaction</td></tr></tbody></table>
<p>Each mode has its strengths, but they share a common limitation: <strong>the resolution is fixed once the connection is established</strong>. In full-screen mode, the resolution is determined by the physical display; in fixed-resolution mode, it's set beforehand; in scaling mode, while the window can change, the image quality varies with the scaling factor.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="5-xiaoye-remote-control-a-new-balance-between-clarity-and-flexibility">5. Xiaoye Remote Control: A New Balance Between Clarity and Flexibility<a href="https://xiaoyeapp.com/blog/2026/03/27/adjust-resolution#5-xiaoye-remote-control-a-new-balance-between-clarity-and-flexibility" class="hash-link" aria-label="Direct link to 5. Xiaoye Remote Control: A New Balance Between Clarity and Flexibility" title="Direct link to 5. Xiaoye Remote Control: A New Balance Between Clarity and Flexibility" translate="no">​</a></h3>
<p>Is there a way to freely adjust the window like scaling mode while maintaining the sharpness of fixed-resolution mode?</p>
<p>Xiaoye Remote takes a different approach: <strong>it dynamically adjusts the resolution rather than scaling the image</strong>.</p>
<p>When you enlarge the window, it tells the remote host: "The window is now bigger—please send me a new resolution that matches." When you shrink the window, it adjusts accordingly. Every time the window size changes, the resolution updates seamlessly. The result is a 1:1 pixel mapping, with no interpolation, no blur, and no empty borders.</p>
<p>There's no need to reconnect or manually tweak settings—the display always adapts to the window, eliminating the blur of scaling mode, the rigidity of fixed-resolution mode, and the lock-in of full-screen mode.</p>
<p>It feels like using a local application: you can freely resize the window, and the content remains perfectly clear.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-xiaoyeremote-switch-20a1f973b879c097fd3bac65682bd177.png" width="798" height="432" class="img_ev3q"></p>
<hr>
<p><strong>Note:</strong> Xiaoye Remote is designed to connect two computers over the internet, so you need to sign in on both machines to use it.</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
        <item>
            <title><![CDATA[Windows Remote Desktop: Create Your Own Shortcuts]]></title>
            <link>https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic</link>
            <guid>https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In daily work, Remote Desktop (mstsc) is a common tool for connecting to servers or office computers. Having to enter the IP address, username, and password every time can be a bit tedious. Today, I'll share a few tips to help you turn Remote Desktop into a one-click connection shortcut.]]></description>
            <content:encoded><![CDATA[<p>In daily work, Remote Desktop (mstsc) is a common tool for connecting to servers or office computers. Having to enter the IP address, username, and password every time can be a bit tedious. Today, I'll share a few tips to help you turn Remote Desktop into a one-click connection shortcut.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-basic-operation-save-an-rdp-file">1. Basic Operation: Save an RDP File<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#1-basic-operation-save-an-rdp-file" class="hash-link" aria-label="Direct link to 1. Basic Operation: Save an RDP File" title="Direct link to 1. Basic Operation: Save an RDP File" translate="no">​</a></h2>
<p>Windows Remote Desktop Connection (mstsc.exe) allows you to save connection configurations as a file with the <code>.rdp</code> extension, so you don't have to re-enter all the information next time.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="steps">Steps:<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#steps" class="hash-link" aria-label="Direct link to Steps:" title="Direct link to Steps:" translate="no">​</a></h3>
<ul>
<li class="">Press <code>Win + R</code>, type <code>mstsc</code>, and open the Remote Desktop Connection window</li>
<li class="">Enter the computer's IP address and username</li>
<li class="">Click "Show Options" below the Connect button to expand more settings</li>
<li class="">In the "General" tab, click the "Save As" button at the bottom</li>
<li class="">Choose a save location, enter a filename, and click Save</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-ScreenShot_2026-03-20_163119_926-682add9f2d117a3e6eb424addc87aa6b.png" width="488" height="568" class="img_ev3q"></p>
<p>Now you have an <code>.rdp</code> file on your desktop. Double-click it to quickly initiate a connection.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="73" height="82" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-advanced-tip-make-the-rdp-file-remember-the-password">2. Advanced Tip: Make the RDP File Remember the Password<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#2-advanced-tip-make-the-rdp-file-remember-the-password" class="hash-link" aria-label="Direct link to 2. Advanced Tip: Make the RDP File Remember the Password" title="Direct link to 2. Advanced Tip: Make the RDP File Remember the Password" translate="no">​</a></h2>
<p>By default, a saved RDP file does not include the password, so you still need to enter it manually each time. To achieve a true "one-click connection," here's a simple trick.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="two-steps-to-remember-the-password">Two Steps to Remember the Password:<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#two-steps-to-remember-the-password" class="hash-link" aria-label="Direct link to Two Steps to Remember the Password:" title="Direct link to Two Steps to Remember the Password:" translate="no">​</a></h3>
<p><strong>Step 1: Check "Save Credentials," then Save As an RDP File</strong></p>
<p><strong><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260314-163723-5adb45fbcef3a592502992b037e9cda8.png" width="485" height="562" class="img_ev3q"></strong></p>
<p><strong>Step 2: Run the RDP File</strong></p>
<p>Double-click the RDP file again. This time, you'll need to enter the password once. After the connection completes, the password will be saved automatically.</p>
<p><strong>Principle:</strong> The "save credentials" operation in the RDP file saves the credentials to the Windows Credential Manager. From then on, double-clicking this RDP file allows you to log in directly without re-entering the password.</p>
<p><strong>Reminder:</strong> Do not save credentials on public computers.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-security-alert-the-yellow-warning-on-rdp-files">3. Security Alert: The Yellow Warning on RDP Files<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#3-security-alert-the-yellow-warning-on-rdp-files" class="hash-link" aria-label="Direct link to 3. Security Alert: The Yellow Warning on RDP Files" title="Direct link to 3. Security Alert: The Yellow Warning on RDP Files" translate="no">​</a></h2>
<p>When you double-click an RDP file, you might see a yellow security warning:</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260314-162447-dfae9e9a8847c32272f0ee260b658762.png" width="542" height="287" class="img_ev3q"></p>
<p>This warning is a security feature in Windows, as RDP files may come from untrusted sources and automatically initiate a connection when double-clicked. However, if you created the RDP file yourself or it comes from a trusted colleague, this recurring warning can be a bit annoying.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="how-to-make-an-rdp-file-trusted">How to Make an RDP File "Trusted"?<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#how-to-make-an-rdp-file-trusted" class="hash-link" aria-label="Direct link to How to Make an RDP File &quot;Trusted&quot;?" title="Direct link to How to Make an RDP File &quot;Trusted&quot;?" translate="no">​</a></h3>
<p>To make Windows trust your RDP file, you need to digitally sign it. A signed RDP file will have the following characteristics:</p>
<ul>
<li class="">The yellow warning bar changes to blue or green (indicating the publisher has been verified)</li>
<li class="">Displays "This remote connection is signed by a trusted publisher"</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rdp-file-signing-methods">RDP File Signing Methods:<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#rdp-file-signing-methods" class="hash-link" aria-label="Direct link to RDP File Signing Methods:" title="Direct link to RDP File Signing Methods:" translate="no">​</a></h3>
<ul>
<li class=""><strong>Use a code signing certificate</strong>: Purchase a code signing certificate from a legitimate CA (such as Symantec, DigiCert)</li>
<li class=""><strong>Sign with rdpsign</strong>:</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">rdpsign /sha256 &lt;your certificate thumbprint&gt; &lt;rdp file&gt;</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Verify the signature</strong>: Right-click the RDP file &gt; Properties &gt; Digital Signatures tab, where you can see the signature information</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260314-162407-3cd7d3a37a4905013c1b48a2ffa5fdd6.png" width="542" height="287" class="img_ev3q"></p>
<p>Double-click the RDP file again, and it looks much cleaner. Of course, signing is not just about appearance—it also prevents tampering with critical information. If someone modifies key information in your RDP file, the signature will become invalid immediately, triggering another orange warning.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-summary-and-best-practices">4. Summary and Best Practices<a href="https://xiaoyeapp.com/blog/2026/03/20/rdp-file-basic#4-summary-and-best-practices" class="hash-link" aria-label="Direct link to 4. Summary and Best Practices" title="Direct link to 4. Summary and Best Practices" translate="no">​</a></h2>
<ul>
<li class=""><strong>Personal daily use</strong>: Follow Step 2 to set up an RDP file that remembers the password for quick and convenient access</li>
<li class=""><strong>Team shared connections</strong>: Use RDP files without saved passwords, paired with a shared password management tool</li>
<li class=""><strong>Security-sensitive environments</strong>: Enable the "Always prompt for password" policy in Group Policy, or use certificate-signed RDP files</li>
<li class=""><strong>Cross-platform use</strong>: Other remote desktop clients that support the RDP protocol generally also support importing RDP files, making things much easier</li>
</ul>
<p>If you use Xiaoye Remote, the default experience is the same as using an RDP file—just double-click to connect. You can also choose to remember the password, which works similarly to the process described above—saving credentials to your local system's Windows Credential Manager</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260320-170041-e1743ff4b3b6a89e8a336eb872411bce.png" width="798" height="432" class="img_ev3q"></p>
<p>With these tips, your remote work experience will be smoother. If you have any questions or better suggestions, feel free to leave a comment below!</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
        <item>
            <title><![CDATA[Xiaoye Remote 2.0.82 Released: Two Devices Permanently Free]]></title>
            <link>https://xiaoyeapp.com/blog/2026/03/18/2082-two-devices-free</link>
            <guid>https://xiaoyeapp.com/blog/2026/03/18/2082-two-devices-free</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Category 3/18/2026]]></description>
            <content:encoded><![CDATA[<p>Category: News Published: 3/18/2026</p>
<p>Tired of complicated network configurations for remote work? Or have you been trying out various solutions in search of a remote control tool that is <strong>both safe and free</strong>? Today, the new version of Xiaoye Remote Control might just be the answer you're looking for.</p>
<p>We are excited to announce the official release of <strong>Xiaoye Remote Control version 2.0.82</strong>! This update introduces an incredibly user-friendly policy: <strong>Two devices, permanently free</strong>. Whether you're providing technical support for a family computer or need seamless switching between two office locations, this free tier covers the daily needs of most individual users.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en-QQ20260318-143946-3b5cecd68a4c11dc887c436716cd1017.png" width="798" height="432" class="img_ev3q"></p>
<!-- -->
<p><strong>Why Choose Xiaoye Remote Control?</strong></p>
<p>Building on its free model, Xiaoye Remote Control is committed to delivering excellence in <strong>both security and user experience</strong>.</p>
<p><strong>1. Security, Designed from the Ground Up</strong></p>
<ul>
<li class=""><strong>Device Isolation by Account</strong>: Your devices are only visible to your own account, naturally protecting them from random scans and attacks originating from the public internet.</li>
<li class=""><strong>End-to-End Encryption</strong>: All remote connection data is encrypted with strong algorithms, ensuring your operations remain private even on public networks.</li>
<li class=""><strong>No Public IP Required</strong>: Say goodbye to complex port forwarding and network configurations, fundamentally reducing your exposure to cyber threats.</li>
</ul>
<p><strong>2. Performance, Built for Efficiency</strong></p>
<ul>
<li class=""><strong>Domestic Multi-Node Acceleration</strong>: We have deployed multiple network nodes within the country. The system automatically selects the optimal path for you, significantly reducing latency and making remote operations feel as smooth as local ones.</li>
<li class=""><strong>Native RDP Experience</strong>: With perfect support for the Windows Remote Desktop Protocol, Windows users can enjoy the most familiar and efficient native desktop access experience.</li>
</ul>
<p><strong>3. Convenience, One Account for All</strong></p>
<ul>
<li class="">Supports various login methods including <strong>email, WeChat, and phone number</strong>. You can also quickly log in using your existing Microsoft or GitHub accounts, eliminating the need for repeated registrations. One "Xiaoye Passport" manages all your remote devices and future services.</li>
</ul>
<p><strong>How to Get Started?</strong></p>
<p>Experiencing Xiaoye Remote Control is simple, just three steps:</p>
<ol>
<li class="">Visit the <strong>Xiaoye Remote Control official website (<a href="https://xiaoyeapp.com/" target="_blank" rel="noopener noreferrer" class="">https://xiaoyeapp.com</a>)</strong> to download the client.</li>
<li class="">Log in using your preferred method (email accounts require initial registration, while third-party options like WeChat allow direct login).</li>
<li class="">Log in to the same account on your two devices, and your permanently free remote journey begins!</li>
</ol>
<p>Xiaoye Remote Control 2.0.82 aims to be your <strong>secure, high-speed, and simple remote desktop partner</strong>. Whether you're a remote professional or the "family IT consultant" helping relatives with their computers, you're welcome to give it a try.</p>
<p>If you encounter any issues during use, or have any suggestions, please feel free to provide feedback through our official channels. We are dedicated to serving you!</p>]]></content:encoded>
            <category>News</category>
        </item>
        <item>
            <title><![CDATA[Local Account vs. Microsoft Account: A Complete Guide to Windows Remote Desktop Login]]></title>
            <link>https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account</link>
            <guid>https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account</guid>
            <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction">Introduction<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Windows Remote Desktop (Remote Desktop Protocol, RDP) is a powerful feature provided by Microsoft, allowing users to remotely control another Windows computer from one device. When connecting to Remote Desktop, users can log in using either a <strong>local account</strong> or a <strong>Microsoft account</strong>, each with its own characteristics and applicable scenarios. This article will detail the differences between these two account types, configuration methods, and login steps to help you choose the most suitable solution.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="i-understanding-the-two-account-types">I. Understanding the Two Account Types<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#i-understanding-the-two-account-types" class="hash-link" aria-label="Direct link to I. Understanding the Two Account Types" title="Direct link to I. Understanding the Two Account Types" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="11-what-is-a-local-account">1.1 What is a Local Account?<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#11-what-is-a-local-account" class="hash-link" aria-label="Direct link to 1.1 What is a Local Account?" title="Direct link to 1.1 What is a Local Account?" translate="no">​</a></h3>
<p>A local account is an account created on a specific computer and exists only on that machine.</p>
<ul>
<li class=""><strong>Nature</strong>: A Windows user account created only on the local computer</li>
<li class=""><strong>Access Scope</strong>: Can only access resources and services on the local computer</li>
<li class=""><strong>Password Storage</strong>: Password is stored on the local computer</li>
<li class=""><strong>Applicable Scenarios</strong>: Standalone use, small office environments without cloud services</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="12-what-is-a-microsoft-account">1.2 What is a Microsoft Account?<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#12-what-is-a-microsoft-account" class="hash-link" aria-label="Direct link to 1.2 What is a Microsoft Account?" title="Direct link to 1.2 What is a Microsoft Account?" translate="no">​</a></h3>
<p>A Microsoft account is a unified login credential provided by Microsoft, usable for accessing all Microsoft services.</p>
<ul>
<li class=""><strong>Nature</strong>: A user account created within Microsoft Azure cloud services</li>
<li class=""><strong>Access Scope</strong>: Can access all Microsoft services, including OneDrive, Office 365, etc.</li>
<li class=""><strong>Password Storage</strong>: Password is stored on Microsoft cloud servers</li>
<li class=""><strong>Applicable Scenarios</strong>: Users needing cloud synchronization and multi-device collaboration</li>
</ul>
<p>You can choose to use a Microsoft account directly during system installation, or you can log in with a local account first and then bind it to a Microsoft account later.</p>
<p><strong>Note</strong>: After binding to a Microsoft account, the local account still exists in the system, but its login method becomes invalid, and it will no longer support remote desktop login using the local account credentials.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en1-QQ20260316-122923-1ce556dc297560dda63a19e3aefa5d12.png" width="833" height="524" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ii-using-a-microsoft-account-to-log-in-to-remote-desktop">II. Using a Microsoft Account to Log in to Remote Desktop<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#ii-using-a-microsoft-account-to-log-in-to-remote-desktop" class="hash-link" aria-label="Direct link to II. Using a Microsoft Account to Log in to Remote Desktop" title="Direct link to II. Using a Microsoft Account to Log in to Remote Desktop" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="21-preparation-before-login">2.1 Preparation Before Login<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#21-preparation-before-login" class="hash-link" aria-label="Direct link to 2.1 Preparation Before Login" title="Direct link to 2.1 Preparation Before Login" translate="no">​</a></h3>
<p>During the Windows installation process, you might use authentication methods like an authenticator app instead of a password. In such cases, the system does not directly store your Microsoft account password, and you need to trigger password verification once.</p>
<p>As shown in the image below, if you have been using a PIN to log in after adding a Microsoft account, the password cache on the controlled computer will not be triggered, and you will be unable to connect via Remote Desktop.</p>
<p>Select the password login option from the login choices below and log in once using your Microsoft account password. This will allow your Microsoft account password to be verified for subsequent Remote Desktop connections.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en2-ScreenShot_2026-03-16_095129_345-da58dda9765d66bcbf59303485816318.png" width="826" height="532" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="22-connection-steps">2.2 Connection Steps<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#22-connection-steps" class="hash-link" aria-label="Direct link to 2.2 Connection Steps" title="Direct link to 2.2 Connection Steps" translate="no">​</a></h3>
<p><strong>On the controlling computer:</strong></p>
<ol>
<li class="">Open Remote Desktop Connection (<code>mstsc</code>)</li>
<li class="">Enter the connection information</li>
</ol>
<ul>
<li class=""><strong>Computer</strong>: The computer name or IP address of the controlled computer</li>
<li class=""><strong>User name</strong>: Enter the complete Microsoft account email address</li>
<li class=""><strong>Password</strong>: Enter your Microsoft account password</li>
</ul>
<ol start="3">
<li class="">Connect successfully</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en3-QQ20260316-114057-d5f2bebe5e98e2c5fb033ee02cb2b343.png" width="468" height="451" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="iii-practical-comparison-of-the-two-login-methods">III. Practical Comparison of the Two Login Methods<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#iii-practical-comparison-of-the-two-login-methods" class="hash-link" aria-label="Direct link to III. Practical Comparison of the Two Login Methods" title="Direct link to III. Practical Comparison of the Two Login Methods" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="31-connection-experience-comparison">3.1 Connection Experience Comparison<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#31-connection-experience-comparison" class="hash-link" aria-label="Direct link to 3.1 Connection Experience Comparison" title="Direct link to 3.1 Connection Experience Comparison" translate="no">​</a></h3>
<table><thead><tr><th>Scenario</th><th>Local Account</th><th>Microsoft Account</th></tr></thead><tbody><tr><td><strong>First Connection</strong></td><td>Directly enter username and password</td><td>Need to ensure password verification has been triggered</td></tr><tr><td><strong>Incorrect Password</strong></td><td>Affects only the single device</td><td>Affects all devices using the cloud password</td></tr><tr><td><strong>Password Recovery</strong></td><td>Requires administrator reset</td><td>Online self-service recovery</td></tr><tr><td><strong>Two-Factor Authentication</strong></td><td>Not supported</td><td>Supported</td></tr><tr><td><strong>Multi-Device Sync</strong></td><td>Manual configuration</td><td>Automatic settings synchronization</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="32-practical-case-comparison">3.2 Practical Case Comparison<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#32-practical-case-comparison" class="hash-link" aria-label="Direct link to 3.2 Practical Case Comparison" title="Direct link to 3.2 Practical Case Comparison" translate="no">​</a></h3>
<p><strong>Case 1: Zhang's Office Computer (Local Account)</strong></p>
<p>Zhang uses a local account to log in to Remote Desktop at his company. He needs to manually maintain the same username and password on every computer that requires remote connection. If the password changes, all computers need to be updated. The advantage is that even if the company network is disconnected, he can still log in to his computer using the local account.</p>
<p><strong>Case 2: Li's Home Network (Microsoft Account)</strong></p>
<p>Li uses a Microsoft account for Remote Desktop at home. He only needs to remember one password, and all his devices synchronize automatically. However, if network issues occur or Microsoft services are interrupted, the login experience might be affected. Additionally, if he changes his password on a new device, he needs to manually trigger password verification once on the controlled computer before continuing to use Remote Desktop.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="iv-common-problems-and-solutions">IV. Common Problems and Solutions<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#iv-common-problems-and-solutions" class="hash-link" aria-label="Direct link to IV. Common Problems and Solutions" title="Direct link to IV. Common Problems and Solutions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="problem-1-unable-to-connect-to-remote-desktop">Problem 1: Unable to Connect to Remote Desktop<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#problem-1-unable-to-connect-to-remote-desktop" class="hash-link" aria-label="Direct link to Problem 1: Unable to Connect to Remote Desktop" title="Direct link to Problem 1: Unable to Connect to Remote Desktop" translate="no">​</a></h3>
<p><strong>Checklist in order:</strong></p>
<ol>
<li class="">Confirm Windows version support (Pro edition and above)</li>
<li class="">Check if Remote Desktop is enabled</li>
<li class="">Confirm the firewall allows Remote Desktop (usually configured automatically when enabled)</li>
<li class="">Verify the account has remote login permissions</li>
<li class="">Confirm the account has a password set</li>
<li class="">Test network connectivity: <code>ping target IP</code></li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="problem-2-microsoft-account-login-fails">Problem 2: Microsoft Account Login Fails<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#problem-2-microsoft-account-login-fails" class="hash-link" aria-label="Direct link to Problem 2: Microsoft Account Login Fails" title="Direct link to Problem 2: Microsoft Account Login Fails" translate="no">​</a></h3>
<p><strong>Possible causes and solutions:</strong></p>
<ul>
<li class=""><strong>Local password verification not triggered</strong>: Log in to Windows once using your Microsoft account password.</li>
<li class=""><strong>Password changed</strong>: Re-execute the password verification command to update the password.</li>
<li class=""><strong>Account locked</strong>: Unlock the account by logging into the Microsoft website.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="problem-3-credentials-cannot-be-verified">Problem 3: Credentials Cannot Be Verified<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#problem-3-credentials-cannot-be-verified" class="hash-link" aria-label="Direct link to Problem 3: Credentials Cannot Be Verified" title="Direct link to Problem 3: Credentials Cannot Be Verified" translate="no">​</a></h3>
<ul>
<li class="">Ensure the username format is correct (local account uses username, Microsoft account uses full email).</li>
<li class="">Check if the password is correct.</li>
<li class="">Try adding a domain prefix before the username: <code>Computer Name\Username</code> or <code>MicrosoftAccount\Email Name</code>.</li>
</ul>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="v-xiaoye-remote-desktops-support-for-microsoft-accounts">V. Xiaoye Remote Desktop's Support for Microsoft Accounts<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#v-xiaoye-remote-desktops-support-for-microsoft-accounts" class="hash-link" aria-label="Direct link to V. Xiaoye Remote Desktop's Support for Microsoft Accounts" title="Direct link to V. Xiaoye Remote Desktop's Support for Microsoft Accounts" translate="no">​</a></h2>
<p>Xiaoye Remote Desktop also supports accessing Remote Desktop using a Microsoft account, provided that your Windows Remote Desktop meets the prerequisites mentioned in Chapter II.</p>
<p><img decoding="async" loading="lazy" src="https://xiaoyeapp.com/assets/images/en4-QQ20260316-103951-c96c84d71da7dbfbe61df1a400bf85f0.png" width="1330" height="722" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://xiaoyeapp.com/blog/2026/03/16/local-account-microsoft-account#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Choosing between a local account and a Microsoft account for Remote Desktop login depends on your specific needs:</p>
<ul>
<li class="">If you are in a <strong>standalone environment or internal network</strong>, focusing on simplicity and directness, a <strong>local account</strong> is perfectly sufficient.</li>
<li class="">If you need <strong>multi-device synchronization, cloud service integration</strong>, and want to simplify password management, a <strong>Microsoft account</strong> is more suitable.</li>
</ul>
<p>Regardless of the choice, proper configuration and security awareness are key to ensuring a smooth and secure remote working experience. We hope this guide helps you easily build a stable and secure remote working environment!</p>]]></content:encoded>
            <category>Windows Remote</category>
        </item>
    </channel>
</rss>