diff --git a/source/uwp/SharedRenderer/lib/XamlBuilder.cpp b/source/uwp/SharedRenderer/lib/XamlBuilder.cpp index 2aebc006e5..788cf60eaa 100644 --- a/source/uwp/SharedRenderer/lib/XamlBuilder.cpp +++ b/source/uwp/SharedRenderer/lib/XamlBuilder.cpp @@ -302,7 +302,18 @@ namespace AdaptiveCards::Rendering::Xaml_Rendering throw ex; } - std::tie(newControl, renderedElement) = XamlHelpers::RenderFallback(element, renderContext, renderArgs); + try + { + std::tie(newControl, renderedElement) = XamlHelpers::RenderFallback(element, renderContext, renderArgs); + } + catch (winrt::hresult_error const& ex) + { + // if we get an E_PERFORM_FALLBACK error again, we should only throw it if `ancestorHasFallBack` + if (ex.code() != E_PERFORM_FALLBACK || (ex.code() == E_PERFORM_FALLBACK && ancestorHasFallback)) + { + throw ex; + } + } } // If we got a control, add a separator if needed and the control to the parent panel diff --git a/source/uwp/SharedRenderer/lib/XamlHelpers.cpp b/source/uwp/SharedRenderer/lib/XamlHelpers.cpp index 963fd2b7bf..13fd970ee1 100644 --- a/source/uwp/SharedRenderer/lib/XamlHelpers.cpp +++ b/source/uwp/SharedRenderer/lib/XamlHelpers.cpp @@ -333,15 +333,28 @@ namespace AdaptiveCards::Rendering::Xaml_Rendering::XamlHelpers if (fallbackElementRenderer) { - fallbackControl = fallbackElementRenderer.Render(fallbackElement, renderContext, renderArgs); - - renderedElement = fallbackElement; + try + { + fallbackControl = fallbackElementRenderer.Render(fallbackElement, renderContext, renderArgs); + renderedElement = fallbackElement; + } + catch (winrt::hresult_error const& ex) + { + if (ex.code() == E_PERFORM_FALLBACK) + { + std::tie(fallbackControl, renderedElement) = RenderFallback(fallbackElement, renderContext, renderArgs); + } + else + { + throw(ex); + } + } } - - if (!fallbackControl) + else { std::tie(fallbackControl, renderedElement) = RenderFallback(fallbackElement, renderContext, renderArgs); } + fallbackHandled = true; break; }