HwndHost element and RadDocking

0 Answers 34 Views
Docking
Giuseppe
Top achievements
Rank 1
Giuseppe asked on 12 Mar 2024, 06:16 PM

Hello,

I'm having some rendering issues with a HwndHost element (set as child of a Border object) that I've partially fixed using RadWindowInteropHelper.SetAllowTransparency method in a NonTrasparentWindowsGeneratedItemsFactory class.

However, there is still one problem, namely, when the window, which contains that Border element, is being maximised using the Telerik docking system, it doesn't render the content of the HwndHost element inside the Border (it looks empty). Also I've noticed that when the window is finally maximised, if the pointer goes over that empty area, the window disappears suddenly.

What could it be?

Thanks,

G.

Martin Ivanov
Telerik team
commented on 14 Mar 2024, 11:16 AM

Can you check the following demo and see if it helps? If not, can you send over a project showing how exactly your HwndHost is implemented and how the Telerik components are setup?
Giuseppe
Top achievements
Rank 1
commented on 14 Mar 2024, 03:42 PM | edited

Hello Martin,

Thanks for the reply. I already tried that example but it didn't help much, however I'll give another try. My HwndHost class, called SdlHost, uses an external C/C++ project to handle SDL 2 rendering by Core.View class. The initialisation of the SdlHost class is done roughly here:

 


private void SDLHostElement_SizeChanged(object sender, SizeChangedEventArgs e)
{
    lock (_lockRender)
    {
        if (SDLHostElement.ActualWidth > 0 && SDLHostElement.ActualHeight > 0 && _sdlHost == null)
        {
            SdlHost sdlHost = new SdlHost(SDLHostElement.ActualWidth, SDLHostElement.ActualHeight);
            sdlHost.Loaded += SdlHost_Loaded;
            sdlHost.HwndMouseEnter += SdlHost_HwndMouseEnter;
            sdlHost.HwndMouseMove += SdlHost_HwndMouseMove;
            sdlHost.HwndMouseLeave += SdlHost_HwndMouseLeave;
            sdlHost.HwndKeyDown += SdlHost_HwndKeyDown;

            SDLHostElement.Child = sdlHost;
            _sdlHost = sdlHost;
        }
        else
        {
            _repaint = true;
        }   
    }
}

private void SdlHost_Loaded(object sender, RoutedEventArgs e)
{
    UpdateSDLHostElementParams(SDLHostElementTypeUpdate.All);
}

private void SdlHost_HwndMouseEnter(object sender, HwndMouseEventArgs e)
{
    _sdlHost?.SetCursorCross();
}

private void SdlHost_HwndMouseMove(object sender, HwndMouseEventArgs e)
{
}

private void SdlHost_HwndMouseLeave(object sender, HwndMouseEventArgs e)
{
    _sdlHost?.SetCursorArrow();
}

private void SdlHost_HwndKeyDown(object sender, HwndKeyEventArgs e)
{
}


The SDLHostElement is a Border object inside an UserControl.

 

<Border Name="SDLHostElement" BorderThickness="0" SizeChanged="SDLHostElement_SizeChanged"/>

The MainWindow.xaml of the app looks like this below:

<telerik:RadDocking Grid.Row="1" HasDocumentHost="False">
    <telerik:RadSplitContainer Width="350">
        <telerik:RadPaneGroup>
            <telerik:RadPane Header="{x:Static resources:StringResources.Menu_OnlineHelp}" Name="HelpPane" CanFloat="False" IsHidden="True">
                <wv2:WebView2 Name="HelpBrowser"/>
            </telerik:RadPane>
        </telerik:RadPaneGroup>
    </telerik:RadSplitContainer>
    <telerik:RadSplitContainer>
        <telerik:RadPaneGroup>
            <telerik:RadPane PaneHeaderVisibility="Collapsed">
                <views:ProDockingControl x:Name="DockingControl" />
            </telerik:RadPane>
        </telerik:RadPaneGroup>
        <telerik:RadPaneGroup>
            <telerik:RadPane Header="{x:Static resources:StringResources.EventViewer}" Name="EventViewerPane" CanFloat="False" IsHidden="True">
                <views2:EventViewerWindow/>
            </telerik:RadPane>
        </telerik:RadPaneGroup>
    </telerik:RadSplitContainer>
</telerik:RadDocking>

While that ProDockingControl is this:

 

<telerik:RadDocking x:Name="Docking" HasDocumentHost="False" telerik:RadDocking.FloatingSize="100, 100"
                    BorderThickness="0" Padding="0" BorderBrush="{StaticResource TransparentBrush}" PreviewShowCompass="Docking_PreviewShowCompass" Close="Docking_PaneClose" RetainPaneSizeMode="DockingAndFloating">
    <telerik:RadDocking.DockingPanesFactory>
        <telerik:DockingPanesFactory/>
    </telerik:RadDocking.DockingPanesFactory>
    <telerik:RadDocking.GeneratedItemsFactory>
        <local:NonTrasparentWindowsGeneratedItemsFactory />
    </telerik:RadDocking.GeneratedItemsFactory>
    <telerik:RadSplitContainer InitialPosition="DockedLeft">
        <telerik:RadPaneGroup x:Name="MainGroup" telerik:RadDocking.SerializationTag="MainGroup" />
    </telerik:RadSplitContainer>
</telerik:RadDocking>

Finally I'm using the Telerik.UI.for.Wpf.60 (2023.1.315) package.

G.

 

Martin Ivanov
Telerik team
commented on 19 Mar 2024, 01:39 PM

Thank you for the additional information. However, my knowledge on this type of HwndHost is a bit limited. Would it be possible to wrap this in a runnable solution that I can test locally?

No answers yet. Maybe you can help?

Tags
Docking
Asked by
Giuseppe
Top achievements
Rank 1
Share this question
or