1<!DOCTYPE html> 2<!--[if IE 7]> 3<html class="ie ie7" lang="en-US"> 4<![endif]--> 5<!--[if IE 8]> 6<html class="ie ie8" lang="en-US"> 7<![endif]--> 8<!--[if !(IE 7) & !(IE 8)]><!--> 9<html lang="en-US"> 10<!--<![endif]--> 11<head> 12<meta charset="UTF-8" /> 13<meta name="viewport" content="width=device-width" /> 14<title>Seamless Navigation in .NET MAUI Hybrid Apps – My .NET MAUI Hybrid Journey (part 1) | Fritz on the Web</title> 15<link rel="profile" href="https://gmpg.org/xfn/11" /> 16<link rel="pingback" href="https://jeffreyfritz.com/xmlrpc.php"> 17<!--[if lt IE 9]>
18<script src="https://jeffreyfritz.com/wp-content/themes/twentytwelve/js/html5.js?ver=3.7.0" type="text/javascript"></script>
18 19<![endif]--> 20<meta name='robots' content='max-image-preview:large' /> 21<link rel='dns-prefetch' href='//fonts.googleapis.com' /> 22<link href='https://fonts.gstatic.com' crossorigin rel='preconnect' /> 23<link rel="alternate" type="application/rss+xml" title="Fritz on the Web » Feed" href="https://jeffreyfritz.com/feed/" /> 24<link rel="alternate" type="application/rss+xml" title="Fritz on the Web » Comments Feed" href="https://jeffreyfritz.com/comments/feed/" /> 25<link rel="alternate" type="application/rss+xml" title="Fritz on the Web » Seamless Navigation in .NET MAUI Hybrid Apps – My .NET MAUI Hybrid Journey (part 1) Comments Feed" href="https://jeffreyfritz.com/2024/04/seamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1/feed/" />
26<script type="text/javascript"> 27/* <![CDATA[ */ 28window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/jeffreyfritz.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.5.12"}}; 29/*! This file is auto-generated */ 30!function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); 31/* ]]> */ 32</script>
32 33<style id='wp-emoji-styles-inline-css' type='text/css'> 34 35 img.wp-smiley, img.emoji { 36 display: inline !important; 37 border: none !important; 38 box-shadow: none !important; 39 height: 1em !important; 40 width: 1em !important; 41 margin: 0 0.07em !important; 42 vertical-align: -0.1em !important; 43 background: none !important; 44 padding: 0 !important; 45 } 46</style> 47<link rel='stylesheet' id='wp-block-library-css' href='https://jeffreyfritz.com/wp-includes/css/dist/block-library/style.min.css?ver=6.5.12' type='text/css' media='all' /> 48<style id='wp-block-library-theme-inline-css' type='text/css'> 49.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:#ffffffa6}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:#ffffffa6}.wp-block-video{margin:0 0 1em}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em} 50</style> 51<style id='kevinbatdorf-code-block-pro-style-inline-css' type='text/css'> 52.wp-block-kevinbatdorf-code-block-pro{direction:ltr!important;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;-webkit-text-size-adjust:100%!important;box-sizing:border-box!important;position:relative!important}.wp-block-kevinbatdorf-code-block-pro *{box-sizing:border-box!important}.wp-block-kevinbatdorf-code-block-pro pre,.wp-block-kevinbatdorf-code-block-pro pre *{font-size:inherit!important;line-height:inherit!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre{background-image:none!important;border:0!important;border-radius:0!important;border-style:none!important;border-width:0!important;color:inherit!important;font-family:inherit!important;margin:0!important;overflow:auto!important;overflow-wrap:normal!important;padding:16px 0 16px 16px!important;text-align:left!important;white-space:pre!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-sha
52dow)!important}.wp-block-kevinbatdorf-code-block-pro.padding-disabled:not(.code-block-pro-editor) pre{padding:0!important}.wp-block-kevinbatdorf-code-block-pro.padding-bottom-disabled pre{padding-bottom:0!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code{background:none!important;background-color:transparent!important;border:0!important;border-radius:0!important;border-style:none!important;border-width:0!important;color:inherit!important;display:block!important;font-family:inherit!important;margin:0!important;overflow-wrap:normal!important;padding:0!important;text-align:left!important;white-space:pre!important;width:100%!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code .line{display:inline-block!important;min-width:var(--cbp-block-width,100%)!important;vertical-align:top!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code .line{padding-left:calc(12px + var(--cbp-line-number-width, auto))!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code{counter-increment:step calc(var(--cbp-line-number-start, 1) - 1)!important;counter-reset:step!important}.wp-block-kevinbatdorf-code-block-pro pre code .line{position:relative!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code .line:before{content:""!important;display:inline-block!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code .line:not(.cbp-line-number-disabled):before{color:var(--cbp-line-number-color,#999)!important;content:counter(step)!important;counter-increment:step!important;left:0!important;opacity:.5!important;position:absolute!important;text-align:right!important;transition-duration:.5s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important;width:var(--cbp-line-number-width,auto)!important}.wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover .line{min-height:var(--cbp-block-height,100%)!important}.wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{background:var(--cbp-line-highlight-color,rgb(14 165 233/.2))!important;left:-16px!important;min-height:var(--cbp-block-height,100%)!important;min-width:calc(var(--cbp-block-width, 100%) + 16px)!important;pointer-events:none!important;position:absolute!important;top:0!important;width:100%!important}[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-.125rem!important}[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-1.5px!important}[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-1px!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor).padding-disabled pre .line.cbp-line-highlight:after{left:0!important;width:100%!important}.wp-block-kevinbatdorf-code-block-pro.cbp-blur-enabled pre .line:not(.cbp-no-blur){filter:blur(1px)!important;opacity:.4!important;pointer-events:none!important;transition-duration:.2s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.wp-block-kevinbatdorf-code-block-pro.cbp-blur-enabled.cbp-unblur-on-hover:hover pre .line:not(.cbp-no-blur){opacity:1!important;pointer-events:auto!important;--tw-blur:blur(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre *{font-family:inherit!important}.cbp-see-more-simple-btn-hover{transition-property:none!important}.cbp-see-more-simple-btn-hover:hover{box-shadow:inset 0 0 100px 100px hsla(0,0%,100%,.1)!important}.code-block-pro-copy-button{border:0!important;border-style:none!important;border-width:0!important;cursor:pointer!important;left:auto!important;line-height:1!important;opacity:.1!important;padding:6px!important;position:absolute!important;right:0!important;top:0!important;transition-duration:.2s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;z-index:10!important}.code-block-pro-copy-button:focus{opacity:.4!important}.code-block-pro-copy-button:not([data-has-text-button]){background:none!important;background-color:transparent!important}.wp-block-kevinbatdorf-code-block-pro.padding-disabled .code-block-pro-copy-button{padding:0!important}.wp-block-kevinbatdorf-code-block-pro:hover .code-block-pro-copy-button{opacity:.5!important}.wp-block-kevinbatdorf-code-block-pro .code-block-pro-copy-button:hover{opacity:.9!important}.code-block-pro-copy-button[data-has-text-button],.wp-block-kevinbatdorf-code-block-pro:hover .code-block-pro-copy-button[data-has-text-button]{opacity:1!important}.wp-block-kevinbatdorf-code-block-pro .code-block-pro-copy-button[data-has-text-button]:hover{opacity:.8!important}.code-block-pro-copy-button[data-has-text-button]{border-radius:.75rem!important;display:block!important;margin-right:.75rem!important;margin-top:.7rem!important;padding:.125rem .375rem!important}.code-block-pro-copy-button[data-inside-header-type=headlightsMuted],.code-block-pro-copy-button[data-inside-header-type^=headlights]{margin-top:.85rem!important}.code-block-pro-copy-button[data-inside-header-type=headlightsMutedAlt]{margin-top:.65rem!important}.code-block-pro-copy-button[data-inside-header-type=simpleString]{margin-top:.645rem!important}.code-block-pro-copy-button[data-inside-header-type=pillString]{margin-top:1rem!important}.code-block-pro-copy-button[data-inside-header-type=pillString] .cbp-btn-text{position:relative!important;top:1px!important}.cbp-btn-text{font-size:.75rem!important;line-height:1rem!important}.code-block-pro-copy-button .without-check{display:block!important}.code-block-pro-copy-button .with-check{display:none!important}.code-block-pro-copy-button.cbp-copying{opacity:1!important}.code-block-pro-copy-button.cbp-copying .without-check{display:none!important}.code-block-pro-copy-button.cbp-copying .with-check{display:block!important}.cbp-footer-link:hover{text-decoration-line:underline!important}@media print{.wp-block-kevinbatdorf-code-block-pro pre{max-height:none!important}.wp-block-kevinbatdorf-code-block-pro:not(#x) .line:before{background-color:transparent!important;color:inherit!important}.wp-block-kevinbatdorf-code-block-pro:not(#x) .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro:not(#x)>span{display:none!important}} 53 54</style> 55<style id='classic-theme-styles-inline-css' type='text/css'> 56/*! This file is auto-generated */ 57.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;
57padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 58</style> 59<style id='global-styles-inline-css' type='text/css'> 60body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--blue: #21759b;--wp--preset--color--dark-gray: #444;--wp--preset--color--medium-gray: #9f9f9f;--wp--preset--color--light-gray: #e6e6e6;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
60--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
60.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 61.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;} 62:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 63:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 64.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;} 65</style> 66<link rel='stylesheet' id='twentytwelve-fonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans%3A400italic%2C700italic%2C400%2C700&subset=latin%2Clatin-ext&display=fallback' type='text/css' media='all' /> 67<link rel='stylesheet' id='twentytwelve-style-css' href='https://jeffreyfritz.com/wp-content/themes/twentytwelve/style.css?ver=20221101' type='text/css' media='all' /> 68<link rel='stylesheet' id='twentytwelve-block-style-css' href='https://jeffreyfritz.com/wp-content/themes/twentytwelve/css/blocks.css?ver=20190406' type='text/css' media='all' /> 69<!--[if lt IE 9]> 70<link rel='stylesheet' id='twentytwelve-ie-css' href='https://jeffreyfritz.com/wp-content/themes/twentytwelve/css/ie.css?ver=20150214' type='text/css' media='all' /> 71<![endif]-->
72<script type="text/javascript" src="https://jeffreyfritz.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
vendor: 1 bytes, line 72
72
73<script type="text/javascript" src="https://jeffreyfritz.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
73 74<link rel="https://api.w.org/" href="https://jeffreyfritz.com/wp-json/" /><link rel="alternate" type="application/json" href="https://jeffreyfritz.com/wp-json/wp/v2/posts/11637" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://jeffreyfritz.com/xmlrpc.php?rsd" /> 75<meta name="generator" content="WordPress 6.5.12" /> 76<link rel="canonical" href="https://jeffreyfritz.com/2024/04/seamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1/" /> 77<link rel='shortlink' href='https://jeffreyfritz.com/?p=11637' /> 78<link rel="alternate" type="application/json+oembed" href="https://jeffreyfritz.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fjeffreyfritz.com%2F2024%2F04%2Fseamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1%2F" /> 79<link rel="alternate" type="text/xml+oembed" href="https://jeffreyfritz.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fjeffreyfritz.com%2F2024%2F04%2Fseamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1%2F&format=xml" /> 80</head> 81 82<body class="post-template-default single single-post postid-11637 single-format-standard wp-embed-responsive custom-font-enabled single-author"> 83<div id="page" class="hfeed site"> 84 <header id="masthead" class="site-header"> 85 <hgroup> 86 <h1 class="site-title"><a href="https://jeffreyfritz.com/" title="Fritz on the Web" rel="home">Fritz on the Web</a></h1> 87 <h2 class="site-description">My little corner of the web, full of my point of view</h2> 88 </hgroup> 89 90 <a href="https://jeffreyfritz.com/"><img src="https://jeffreyfritz.com/wp-content/uploads/2015/11/cropped-cropped-header_compressed.jpg" class="header-image" width="1256" height="327" alt="Fritz on the Web" /></a> 91 92 <nav id="site-navigation" class="main-navigation"> 93 <button class="menu-toggle">Menu</button> 94 <a class="assistive-text" href="#content" title="Skip to content">Skip to content</a> 95 <div class="menu-menu-1-container"><ul id="menu-menu-1" class="nav-menu"><li id="menu-item-11605" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-11605"><a href="https://jeffreyfritz.com">Home</a></li> 96<li id="menu-item-11609" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11609"><a href="https://jeffreyfritz.com/live/">Live Stream</a></li> 97<li id="menu-item-11608" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11608"><a href="https://jeffreyfritz.com/about/">About Jeff</a></li> 98<li id="menu-item-11655" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11655"><a href="https://jeffreyfritz.com/thank-you-supporters/">Thank you supporters</a></li> 99</ul></div> </nav><!-- #site-navigation --> 100 101 102 </header><!-- #masthead --> 103 104 <div id="main" class="wrapper"> 105 106 <div id="primary" class="site-content"> 107 <div id="content" role="main"> 108 109 110 111 <article id="post-11637" class="post-11637 post type-post status-publish format-standard has-post-thumbnail hentry category-net category-net-maui category-uncategorized tag-net-maui tag-blazor"> 112 <header class="entry-header"> 113 <img width="624" height="351" src="https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI-624x351.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI-624x351.png 624w, https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI-300x169.png 300w, https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI-1024x576.png 1024w, https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI-768x432.png 768w, https://jeffreyfritz.com/wp-content/uploads/2024/04/NET-MAUI.png 1280w" sizes="(max-width: 624px) 100vw, 624px" /> 114 <h1 class="entry-title">Seamless Navigation in .NET MAUI Hybrid Apps – My .NET MAUI Hybrid Journey (part 1)</h1> 115 </header><!-- .entry-header --> 116 117 <div class="entry-content"> 118 119<p>I’ve always wanted to build a native application with all the insight and expertise that I’ve accumulated in building web applications, it’s felt like a big jump for me to get into native mobile or desktop applications. A long time ago I used to build windows forms applications for my employer, and I haven’t worked a desktop application since.</p> 120 121 122 123<p>
123With the advent of <a href="https://dotnet.microsoft.com/en-us/apps/maui" target="_blank" rel="noreferrer noopener">.NET MAUI</a> and the ability to build Blazor applications for a website and share their pages and components for use in a native application felt like a real possibility for me. I haven’t really stepped into building and working working with this application model yet⦠until now.</p> 124 125 126 127<p>This is the first of what I expect will be a series of blog posts describing things that I’ve discovered, challenges that I’ve overcome, and features as I migrate the <a href="https://tagzapp.net" target="_blank" rel="noreferrer noopener">TagzApp application</a> to run as a native desktop application.</p> 128 129 130 131<h2 class="wp-block-heading">Menus – Not as Easy as They Look</h2> 132 133 134 135<p>The first feature that I wanted to bring over was going to be the layout of the application. In TagzApp I have a very simple layout with a header menu bar with a couple of options to allow you to navigate to other areas of the application. It’s not too complex but it felt like an easy piece to migrate over to the hybrid application.</p> 136 137 138 139<p>In doing some research and thinking more about how I want to represent a menubar inside of a native application it felt like it made more sense to turn this into a native menubar and not an HTML menubar that lived inside of my Blazor application. I started doing some research about how to create a menubar in .NET MAUI and found a few examples that showed how to use a tab bar to create and use multiple BlazorWebView components to represent different sections of the application. This felt clumsy to me because it meant that I would be spinning up multiple browsers to run inside of my application just to access and work with other parts of the application. I knew that that would mean more resources used by the computer when this application is running, and that felt a little irresponsible for me as a developer.</p> 140 141 142 143<p>I wanted to actually have a menu bar with items that you would click and it would navigate inside of my Blazor application. Looking at the documentation for the BlazorWebView, there is no direct access to the NavigationManager or an ability to reset the location of the browser component. I set about to make the NavigationManager inside of Blazor accessible to the .NET MAUI application.</p> 144 145 146 147<p>In the demos on this post, I’ll start with the default Blazor Hybrid template application and turn the vertical NavBar element into a native menu. <a href="https://github.com/csharpfritz/BlazorHybridNavigation" data-type="link" data-id="https://github.com/csharpfritz/BlazorHybridNavigation" target="_blank" rel="noreferrer noopener">Completed source code</a> for this sample is available on my GitHub. I also have recorded a video where I talk through this demo:</p> 148 149 150 151<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> 152<iframe title="Blazor Navigation with .NET MAUI Components" width="625" height="352" src="https://www.youtube.com/embed/hmHOnRNl_j0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 153</div></figure> 154 155 156<div class="wp-block-image"> 157<figure class="aligncenter size-full"><a href="https://jeffreyfritz.com/wp-content/uploads/2024/04/image.png"><img decoding="async" width="738" height="560" src="https://jeffreyfritz.com/wp-content/uploads/2024/04/image.png" alt="" class="wp-image-11638" srcset="https://jeffreyfritz.com/wp-content/uploads/2024/04/image.png 738w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-300x228.png 300w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-624x473.png 624w" sizes="(max-width: 738px) 100vw, 738px" /></a><figcaption class="wp-element-caption">The default experience inside a Blazor Hybrid application with .NET 8</figcaption></figure></div> 158 159 160<h2 class="wp-block-heading">Configuring the Shell and Menu Items</h2> 161 162 163 164<p>To start with, I configured the App.xaml file to have a <a href="https://learn.microsoft.com/dotnet/maui/fundamentals/shell/" target="_blank" rel="noreferrer noopener">Shell</a> embedded directly and contain the BlazorWebView for my application. This would allow me to add a Menubar to the Shell.</p> 165 166 167 168<pre class="wp-block-code"><code><
168Application.MainPage> 169 <Shell> 170 <ShellContent> 171 <ShellContent.ContentTemplate> 172 <DataTemplate> 173 <ContentPage> 174 <BlazorWebView x:Name="blazorWebView1" HostPage="wwwroot/index.html"> 175 <BlazorWebView.RootComponents> 176 <RootComponent Selector="#app" ComponentType="{x:Type local:Components.Routes}" /> 177 </BlazorWebView.RootComponents> 178 </BlazorWebView> 179 </ContentPage> 180 </DataTemplate> 181 </ShellContent.ContentTemplate> 182 </ShellContent> 183 </Shell> 184</Application.MainPage> 185</code></pre> 186 187 188 189<p>I also removed the call inside App.xaml.cs to set <code>MainPage = new MainPage(); </code> Since we’re specifying our own MainPage inside the XAML markup, there’s no need to instantiate another page. I could run the application now, and I’d get the same user experience as the previous image.</p> 190 191 192 193<p>Ok.. next steps…</p> 194 195 196 197<h2 class="wp-block-heading">Adding a MenuBar component</h2> 198 199 200 201<p>In .NET MAUI, the MenuBar component is added when you introduce MenubarItems. No problem, I added a MenuBarItem and 3 MenuFlyoutItems for the 3 base pages inside the default application. This code was added just inside the <code>ContentPage</code> element in App.xaml</p> 202 203 204 205<pre class="wp-block-code"><code><ContentPage.MenuBarItems> 206 <MenuBarItem Text="Content"> 207 <MenuFlyoutItem Text="Home" Clicked="MenuItem_Clicked"></MenuFlyoutItem> 208 <MenuFlyoutItem Text="Counter" Clicked="MenuItem_Clicked"></MenuFlyoutItem> 209 <MenuFlyoutItem Text="Weather" Clicked="MenuItem_Clicked"></MenuFlyoutItem> 210 </MenuBarItem> 211</ContentPage.MenuBarItems></code></pre> 212 213 214 215<p>Notice that I set each of the menu items to trigger the same event, <code>MenuItem_Clicked</code> All of these menu items do the same thing, but vary in the location they target. We’ll write this method in a little bit, because we need to first make the NavigationManager available</p> 216 217 218 219<h2 class="wp-block-heading">Enabling the NavigationManager in .NET MAUI</h2> 220 221 222 223<p>The Blazor NavigationManager isn’t directly accessible in .NET MAUI. You can’t inject it or reach into the BlazorWebView and interact with it. Instead, we need to create a service that will allow us to capture the NavigationManager and interact with it. The curious part of this is that both parts of the application model, .NET MAUI and Blazor use the same dependency injection services. So…. we can exploit this to allow our service to be injected into both Blazor AND .NET MAUI.</p> 224 225 226 227<p>No problem, I can whip up a little bit of code that allows both application models to work with the Blazor NavigationManager:</p> 228 229 230 231<pre class="wp-block-code"><code>public class NavigatorService 232{ 233 234 internal NavigationManager NavigationManager { get; set; } 235 236} 237</code></pre> 238 239 240 241<p>I can then register this <code>NavigatorService</code> with the service locator in .NET MAUI with this line in the MauiProgram.cs file:</p> 242 243 244 245<pre class="wp-block-code"><code>builder.Services.AddSingleton<NavigatorService>();</code></pre> 246 247 248 249<p>I want this Navigator service on every page in my Blazor application, so I’ll inject it and configure the NavigationManager we’ll use inside the MainLayout.razor file:</p> 250 251 252 253<pre class="wp-block-code"><code>@inherits LayoutComponentBase 254@inject MauiApp1.NavigatorService NavigatorService 255@inject NavigationManager NavigationManager 256 257<div class="page"> 258... 259</div> 260 261@code { 262 263 protected override void OnInitialized() 264 { 265 266 NavigatorService.NavigationManager = NavigationManager; 267 268 } 269 270}</code></pre> 271 272 273 274<p>Finally, I’ll add the NavigatorService to my App.xaml.cs code so that it is injected and stored as a property for use later:</p> 275 276 277 278<pre class="wp-block-code"><code>public partial class App : Application 279{ 280 public App(NavigatorService navigatorService) 281 { 282 InitializeComponent(); 283 NavigatorService = navigatorService; 284 } 285 286 internal NavigatorService NavigatorService { get; } 287 288 private void MenuItem_Clicked(object sender, EventArgs e) 289 { 290 } 291}</code></pre> 292 293 294 295<h2 class="wp-block-heading">Connecting and Navigating from the MenuBar</h2> 296 297 298 299<p>Now, we can use a switch statement to configure the navigation of the BlazorWebView. Let’s add that switch inside the <code>Menuitem_Clicked</code> method:</p> 300 301 302 303<pre class="wp-block-code"><code>private void MenuItem_Clicked(object sender, EventArgs e) 304{ 305 306 var menuItem = (MenuItem)sender; 307 var url = menuItem.Text switch 308 { 309 "Counter" => "/counter", 310 "Weather" => "/weather", 311 _ => "/" 312 }; 313 NavigatorService.NavigationManager.NavigateTo(url); 314 315}</code></pre> 316 317 318 319<figure class="wp-block-image size-full"><a href="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1.png"><img loading="lazy" decoding="async" width="832" height="650" src="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1.png" alt="" class="wp-image-11639" srcset="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1.png 832w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1-300x234.png 300w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1-768x600.png 768w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-1-624x488.png 624w" sizes="(max-width: 832px) 100vw, 832px" /></a><figcaption class="wp-element-caption">Application with the new MenuBar</figcaption></figure> 320 321 322 323<p>Now, when we click the various items in the native MenuBar, the browser navigates appropriately.</p> 324 325 326 327<p>For completeness, I removed the side navigation from the MainLayout.razor file so that the application felt more native and didn’t have 2 MenuBars.</p> 328 329 330 331<figure class="wp-block-image size-full"><a href="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2.png"><img loading="lazy" decoding="async" width="832" height="650" src="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2.png" alt="" class="wp-image-11640" srcset="https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2.png 832w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2-300x234.png 300w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2-768x600.png 768w, https://jeffreyfritz.com/wp-content/uploads/2024/04/image-2-624x488.png 624w" sizes="(max-width: 832px) 100vw, 832px" /></a></figure> 332 333 334 335<h2 class="wp-block-heading">Summary</h2> 336 337 338 339<p>This is just one creative way to connect our Blazor application to .NET MAUI and reuse the code we’ve already built in Blazor. The <a href="https://github.com/csharpfritz/BlazorHybridNavigation" target="_blank" rel="noreferrer noopener">complete source code</a> for this sample is available on my GitHub. I’m working through an entire application for TagzApp, and will share more of my findings in the weeks ahead.</p> 340 341 342 343<p>Have you tried using Blazor content in .NET MAUI, WPF, or Windows Forms? What was your experience? Let me know in the comments below</p> 344 </div><!-- .entry-content --> 345 346 <footer class="entry-meta"> 347 This entry was posted in <a href="https://jeffreyfritz.com/category/net/" rel="category tag">.NET</a>, <a href="https://jeffreyfritz.com/category/net/net-maui/" rel="category tag">.NET MAUI</a>, <a href="https://jeffreyfritz.com/category/uncategorized/" rel="category tag">Uncategorized</a> and tagged <a href="https://jeffreyfritz.com/tag/net-maui/" rel="tag">.NET MAUI</a>, <a href="https://jeffreyfritz.com/tag/blazor/" rel="tag">blazor</a> on <a href="https://jeffreyfritz.com/2024/04/seamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1/" title="10:40" rel="bookmark"><time class="entry-date" datetime="2024-04-12T10:40:26-04:00">April 12, 2024</time></a><span class="by-author"> by <span class="author vcard"><a class="url fn n" href="https://jeffreyfritz.com/author/jfritz/" title="View all posts by Jeff" rel="author">Jeff</a></span></span>. </footer><!-- .entry-meta --> 348 </article><!-- #post --> 349 350 <nav class="nav-single"> 351 <h3 class="assistive-text">Post navigation</h3> 352 <span class="nav-previous"><a href="https://jeffreyfritz.com/2024/02/from-iot-to-the-cloud-a-net-ecosystem-showcase-with-github-raspberry-pi-and-azure/" rel="prev"><span class="meta-nav">←</span> From IoT to the Cloud: A .NET Ecosystem Showcase with GitHub, Raspberry Pi, and Azure</a></span> 353 <span class="nav-next"><a href="https://jeffreyfritz.com/2024/07/adding-antivirus-to-net-aspire-systems/" rel="next">Adding Antivirus to .NET Aspire Systems <span class="meta-nav">→</span></a></span> 354 </nav><!-- .nav-single --> 355 356 357<div id="comments" class="comments-area"> 358 359 360 361 362</div><!-- #comments .comments-area --> 363 364 365 </div><!-- #content --> 366 </div><!-- #primary --> 367 368 369 <div id="secondary" class="widget-area" role="complementary"> 370 <aside id="text-5" class="widget widget_text"> <div class="textwidget"><p><strong><a href="http://twitch.tv/csharpfritz">Follow me on Twitch</a>!</strong></p> 371<p><strong><a href="https://mas.to/@csharpfritz" rel="me">Follow me on Mastodon</a></strong></p> 372<p><strong><a href="https://youtube.com/csharpfritz" rel="me">Watch my videos on YouTube</a></strong></p> 373</div> 374 </aside><aside id="search-6" class="widget widget_search"><form role="search" method="get" id="searchform" class="searchform" action="https://jeffreyfritz.com/"> 375 <div> 376 <label class="screen-reader-text" for="s">Search for:</label> 377 <input type="text" value="" name="s" id="s" /> 378 <input type="submit" id="searchsubmit" value="Search" /> 379 </div> 380 </form></aside> 381 <aside id="recent-posts-6" class="widget widget_recent_entries"> 382 <h3 class="widget-title">Recent Posts</h3> 383 <ul> 384 <li> 385 <a href="https://jeffreyfritz.com/2024/07/adding-antivirus-to-net-aspire-systems/">Adding Antivirus to .NET Aspire Systems</a> 386 </li> 387 <li> 388 <a href="https://jeffreyfritz.com/2024/04/seamless-navigation-in-net-maui-hybrid-apps-my-net-maui-hybrid-journey-part-1/" aria-current="page">Seamless Navigation in .NET MAUI Hybrid Apps – My .NET MAUI Hybrid Journey (part 1)</a> 389 </li> 390 <li> 391 <a href="https://jeffreyfritz.com/2024/02/from-iot-to-the-cloud-a-net-ecosystem-showcase-with-github-raspberry-pi-and-azure/">From IoT to the Cloud: A .NET Ecosystem Showcase with GitHub, Raspberry Pi, and Azure</a> 392 </li> 393 </ul> 394 395 </aside><aside id="text-3" class="widget widget_text"><h3 class="widget-title">My Courses</h3> <div class="textwidget"><h3>WintellectNow</h3> 396<ul> 397<li><a href="https://wintellectnow.com/Videos/Watch?videoId=getting-started-with-angular-2-and-aspdotnet-core">Get Started with Angular 2 and ASP.NET Core</a></li> 398<li><a href="https://wintellectnow.com/Videos/Watch?videoId=getting-started-with-aspdotnet-core-1.0">Getting Started with ASP.NET Core 1.0</a></li> 399<li><a href="https://wintellectnow.com/Videos/Watch?videoId=docker-for-aspdotnet-core-developers">Docker for ASP.NET Core Developers</a></li> 400<li><a href="https://www.wintellectnow.com/Videos/Watch?videoId=aspdotnet-core-middleware">ASP.NET Core Middleware</a></li><li><a href="https://www.wintellectnow.com/Videos/Watch?videoId=building-aspdotnet-core-web-uis-with-razor">Building ASP.NET Core Web UIs with Razor</a></li><li><a href="https://www.wintellectnow.com/Videos/Watch?videoId=authentication-and-authorization-in-aspdotnet-core">Authentication and Authorization in ASP.NET Core</a></li><li><a href="https://www.wintellectnow.com/Videos/Watch?videoId=net-standard-for-mere-mortals">.NET Standard for Mere Mortals</a></li> 401</ul> 402<img src="/wp-content/uploads/2014/11/pslogo_3.png" alt="Pluralsight"/> 403<br/>
403 404<ul> 405<li><a href="http://www.pluralsight.com/courses/mobilize-aspdotnet-web-forms">Mobilize Your ASP.NET Web Forms</a></li> 406 <li><A HREF="http://www.pluralsight.com/courses/one-aspdotnet-from-scratch">One ASP.NET from Scratch</a></li> 407</ul></div> 408 </aside> </div><!-- #secondary --> 409 </div><!-- #main .wrapper --> 410 <footer id="colophon" role="contentinfo"> 411 <div class="site-info"> 412 <a class="privacy-policy-link" href="https://jeffreyfritz.com/privacy-policy/" rel="privacy-policy">Privacy Policy</a><span role="separator" aria-hidden="true"></span> <a href="https://wordpress.org/" class="imprint" title="Semantic Personal Publishing Platform"> 413 Proudly powered by WordPress </a> 414 </div><!-- .site-info --> 415 </footer><!-- #colophon --> 416</div><!-- #page --> 417
418<script type="text/javascript" src="https://jeffreyfritz.com/wp-content/themes/twentytwelve/js/navigation.js?ver=20141205" id="twentytwelve-navigation-js"></script>
418 419</body> 420</html> 421<!-- 422Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com 423 424Retrieved 757 objects (324 KB) from Redis using Predis (v2.1.2). 425-->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.