Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

Microsoft Silverlight – Resize controls in a canvas within the web browser

Using the ‘Canvas.RenderTransform’ in your base Silverlight XAML, along with some resizing logic in the base Silverlight .vb class, the controls within your browser will resize as you change the size of the browser.

In this scenario, the App.xaml Application_Startup event passes control to the first displayable Silverlight xaml called, ‘host’, which contains the resizing logic. As long as I don’t remove ‘host’, the resizing logic is not needed in any other xaml.

Example:

In the MyApplication Application, the following flow occurs:

App.xaml executes the following statement that loads the first Silverlight Control:

me.RootVisual = New host(IPAddress)

‘host’ then adds the logon.xaml on top of the ‘host’ with the following statement:

ucLogon = New Logon(mIPAddress)

When the logon is successful, ‘logon’ is removed from host and the main.xaml is then added.

LayoutRoot.Children.Remove(ucLogon)
LayoutRoot.Children.Add(ucMain)

Going forward, all Messages, which are xaml files, are simply added and removed from ‘main’. As long as ‘host’ is never unloaded, resizing the browser will continue to raise the ‘resize’ event logic in the host.xaml.vb class.

How To:

The following markup is needed in the host.xaml.

<UserControl x:Class="SilverlightApplication.host"
xmlns="http://schemas.microsoft.com/client/2007?
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008? xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006? mc:Ignorable="d">
<Canvas x:Name="LayoutRoot" Canvas.Top="0? Canvas.Left="0? Width="800? Height="600?>
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1? StartPoint="0.5,0?>
<GradientStop Color="#FF000000?/>
<GradientStop Color="#FF7CA9E7? Offset="1?/>
</LinearGradientBrush>
</Canvas.Background>
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="RootCanvasScaleTransform" ScaleX="1? ScaleY="1? />
<TranslateTransform x:Name="RootCanvasTranslateTransform" X="0? Y="0? />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</UserControl>

The following code is needed in the host.xaml.vb.

#Region "Private Vars"
    '***RESIZE CONTROLS*** add our event handler
    Private _originalWidth As Double
    Private _originalHeight As Double
    '***RESIZE CONTROLS*** add our event handler
#End Region
 
#Region "Public Events"
    Public Sub New(ByVal pIPAddress As String)
        '***RESIZE CONTROLS*** add our event handler
        Root = Me
        AddHandler Me.Loaded, AddressOf host_Loaded
        '***RESIZE CONTROLS*** add our event handler
    End Sub
#End Region
 
#Region "Public Vars"
    '***RESIZE CONTROLS*** add our event handler
    Public Shared Root As host
    '***RESIZE CONTROLS*** add our event handler
#End Region
 
#Region "Private Event Handlers"
    Private Sub host_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs)
        Try
            '***RESIZE CONTROLS*** add our event handler
            'Capture the existing height and width.
            _originalWidth = LayoutRoot.Width
            _originalHeight = LayoutRoot.Height
			
            AddHandler Application.Current.Host.Content.Resized, AddressOf Content_Resized
            
			'Define our resize event handler to call Content_Resized method.
            'Call our Resize function for the first time.
            Resize()
            
			'***RESIZE CONTROLS*** add our event handler
            ucLogon = New Logon(mIPAddress)
            LayoutRoot.Children.Add(ucLogon)
        Catch ex As Exception
		
        End Try
    End Sub
 
    '***RESIZE CONTROLS*** add our event handler
    Private Sub Content_Resized(ByVal sender As Object, ByVal e As EventArgs)
        Resize()
    End Sub
 
    '***RESIZE CONTROLS*** add our event handler
    '***RESIZE CONTROLS*** add our event handler
    Private Sub Resize()
        Dim currentWidth As Double = Application.Current.Host.Content.ActualWidth
        Dim currentHeight As Double = Application.Current.Host.Content.ActualHeight
        'We now scale the RootCanvas to fit the control
        Dim uniformScaleAmount As Double = Math.Min((currentWidth / _originalWidth), (currentHeight / _originalHeight))
        RootCanvasScaleTransform.ScaleX = uniformScaleAmount
        RootCanvasScaleTransform.ScaleY = uniformScaleAmount
        Dim scaledWidth As Double = Math.Min(_originalWidth * uniformScaleAmount, currentWidth)
        Dim scaledHeight As Double = Math.Min(_originalHeight * uniformScaleAmount, currentHeight)
        RootCanvasTranslateTransform.X = (Math.Min(LayoutRoot.ActualWidth, currentWidth) – scaledWidth) / 2
        RootCanvasTranslateTransform.Y = (Math.Min(LayoutRoot.ActualHeight, currentHeight) – scaledHeight) / 2 End Sub
        '***RESIZE CONTROLS*** add our event handler
#End Region

Leave a Reply