Xamarin Forms Designing Responsive Ui For Multiple Screen Sizes Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    10 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of Xamarin Forms Designing Responsive UI for Multiple Screen Sizes

Explaining in Details and Showing Important Information on Xamarin.Forms Designing Responsive UI for Multiple Screen Sizes

Understanding Xamarin.Forms Layout

Xamarin.Forms provides several layout controls that help you create responsive designs:

  1. StackLayout: Arranges child views either horizontally or vertically in a stack.
  2. Grid: Organizes child views into rows and columns.
  3. RelativeLayout: Positions views relative to each other and the parent container.
  4. AbsoluteLayout: Positions and sizes elements explicitly by defining their position and size in terms of proportions of the layout dimensions.
  5. FlexLayout: Provides flexible and powerful layout capabilities with support for alignment, wrapping, and ordering of views.
  6. ScrollView: Allows scrolling over a single child that is larger than its allocated space.

Flexible Layout Options

Utilizing Xamarin.Forms features enables you to create flexible layouts:

  • Auto-Size Properties: Use WidthRequest and HeightRequest carefully as they can prevent responsive behavior.
  • Proportional Sizing: Set properties like HorizontalOptions and VerticalOptions to FillAndExpand to fill available space dynamically.
  • Dynamic Resource Adjustment: Use OnSizeAllocated method to adjust controls dynamically based on screen size changes.

Relative Units

Incorporate relative units to ensure your controls scale appropriately:

  1. Device Metrics: Use Device.RuntimePlatform to apply platform-specific properties.
  2. RelativeToParent and RelativeToView: Within RelativeLayout, these properties allow elements to size themselves relative to another view or the entire parent.
  3. GridLength.Star: In Grid, this property divides the column or row equally among star-sized columns/rows.

Screen-Specific Styles

Leverage screen-specific styles and resource dictionaries to manage different UI designs:

  • Xaml Styles: Apply dynamic styles based on conditions or platform.
  • Resource Dictionaries: Store styles and colors separately to be reused across projects. Define styles conditionally in XAML using When triggers.
  • Style Triggers: Adjust styles based on certain conditions (e.g., state, property value).

Testing on Multiple Devices

Testing is vital to ensure your UI works correctly on a variety of devices:

  • Emulators/Simulators: Use built-in emulators or external tools for extensive testing without needing physical devices.
  • Xamarin Test Cloud: Integrate with Test Cloud services for automated testing on real devices.
  • Physical Devices: Whenever possible, test on multiple physical devices to catch specific platform issues.

Adaptive UI Techniques

Implement adaptive techniques to enhance user experience:

  • Responsive Triggers: Utilize Xamarin’s Trigger system which can react to different screen sizes or orientation changes.
  • Conditional XAML: Write conditional XAML to display different content or layouts based on device characteristics.
  • Orientation Considerations: Handle changes in screen orientation by adjusting your layout at runtime or through XAML triggers.

Dynamic UI Adjustments

Perform dynamic UI adjustments through code:

  • OnOrientationChanged Method: Override this method in your page code behind to make real-time layout changes.
  • OnAppearing and OnDisappearing Methods: Use these lifecycle methods to adjust resources when entering or leaving pages.
  • Device.DisplayMetrics: Access metrics such as width, height, density, etc., to make layout decisions based on device properties.

Using Built-in Features

Harness built-in features of Xamarin.Forms for efficient responsive design:

  • ConstraintLayouts: In RelativeLayout, apply constraints to align controls accurately.
  • Custom Renderers: Customize platform-specific rendering for more control over UI scaling and positioning.
  • FlowDirection Property: Facilitates right-to-left language support which can affect layout.

Handling Different Form Factors

Consider different form factors (phones, tablets, phablets):

  • Device Idiom: Check Device.Idiom to determine if the device is a phone, tablet, tablet/desktop, or unsupported idiom.
  • Adaptive Layouts: Create separate XAML files or conditional code blocks to target specific form factors.
  • Split Views: Implement split views to optimize large screen utilization without breaking smaller screens.

Important Libraries and Tools

Use additional libraries and tools to support responsive UI design:

  • Xamarin.Essentials: A set of cross-platform APIs to perform common tasks, including accessing device metrics programmatically.
  • Xamarin.Forms.Xaml.StyleSheets: Enables developers to write CSS-like styling rules for XAML which can be particularly useful in maintaining consistent design across multiple screen sizes.
  • Refractored.FabControl: Enhances floating action buttons to work responsively across varying screen sizes.

Best Practices

Follow best practices to streamline your responsive design process:

  • Consistent Layout Patterns: Keep layout logic consistent across different pages for maintainability.
  • Scalable Graphics: Use vector graphics (SVG) or scalable raster images (PNG) with 9-patch regions to adapt to different resolutions.
  • User Experience (UX): Prioritize usability by placing important controls in easily accessible positions regardless of screen size.
  • Performance Optimization: Regularly test performance and optimize resources to prevent sluggishness or excessive memory usage.

By adhering to these principles and guidelines, you can efficiently and effectively design Xamarin.Forms applications that provide a robust, responsive, and visually appealing interface across a multitude of devices and screen sizes.


Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement Xamarin Forms Designing Responsive UI for Multiple Screen Sizes

Step 1: Understand the Basics

Xamarin.Forms Layouts

  1. StackLayout: Stacks child elements horizontally or vertically.
  2. Grid: Creates a table-like layout with rows and columns.
  3. AbsoluteLayout: Positions elements based on exact coordinates.
  4. RelativeLayout: Positions elements relative to the layout or other elements.
  5. FlexLayout: A flexible layout that can be used to stack items vertically or horizontally.

Size and Orientation

Xamarin.Forms supports handling different screen sizes and orientations through:

  • Device.Idiom: Checks if the device is a phone, tablet, etc.
  • Device.RuntimePlatform: Gets the current platform (iOS, Android, UWP).
  • DeviceInfo.ScreenWidth: Gets the width of the screen.
  • DeviceInfo.ScreenHeight: Gets the height of the screen.

Step 2: Create a Simple Responsive UI Using StackLayout

Example: A simple page with a heading, input, button, and message label

  1. Open Visual Studio and create a new Xamarin.Forms project.
  2. In MainPage.xaml, add the following XAML code:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResponsiveUI.MainPage"
             Title="Responsive UI with StackLayout">
    <ContentPage.Resources>
        <ResourceDictionary>
            <!-- Define custom styles with padding and margin -->
            <Style x:Key="LabelStyle" TargetType="Label">
                <Setter Property="HorizontalOptions" Value="Center"/>
                <Setter Property="FontSize" Value="Large"/>
                <Setter Property="Margin" Value="10"/>
            </Style>
            <Style x:Key="EntryStyle" TargetType="Entry">
                <Setter Property="HorizontalOptions" Value="FillAndExpand"/>
                <Setter Property="Margin" Value="10"/>
                <Setter Property="Placeholder" Value="Enter Your Name..."/>
            </Style>
            <Style x:Key="ButtonStyle" TargetType="Button">
                <Setter Property="HorizontalOptions" Value="Center"/>
                <Setter Property="Text" Value="Submit"/>
                <Setter Property="BackgroundColor" Value="#2196F3"/>
                <Setter Property="FontColor" Value="White"/>
                <Setter Property="Margin" Value="10"/>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout>
        <Label Text="Hello User!" Style="{DynamicResource LabelStyle}" />
        <Entry Style="{DynamicResource EntryStyle}" x:Name="UserNameEntry" />

        <Button Style="{DynamicResource ButtonStyle}" Clicked="OnSubmitClicked"/>

        <Label Text="Welcome Message will appear here..." Style="{DynamicResource LabelStyle}" x:Name="MessageLabel"/>
    </StackLayout>
</ContentPage>
  1. In MainPage.xaml.cs, implement the OnSubmitClicked method:
using System;
using Xamarin.Forms;

namespace ResponsiveUI
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void OnSubmitClicked(object sender, EventArgs e)
        {
            string name = UserNameEntry.Text != null ? UserNameEntry.Text.Trim() : "";
            MessageLabel.Text = String.IsNullOrEmpty(name) ? "Please enter your name." : $"Hello {name}!";
        }
    }
}

Step 3: Use Grid Layout for More Control

Example: Create a more complex UI with a Grid Layout

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResponsiveUI.GridPage"
             Title="Responsive UI with Grid">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style x:Key="GridLabelStyle" TargetType="Label">
                <Setter Property="VerticalOptions" Value="Center"/>
                <Setter Property="HorizontalTextAlignment" Value="End"/>
                <Setter Property="FontSize" Value="Medium"/>
                <Setter Property="Margin" Value="10"/>
            </Style>
            <Style x:Key="GridEntryStyle" TargetType="Entry">
                <Setter Property="HorizontalOptions" Value="FillAndExpand"/>
                <Setter Property="Margin" Value="10"/>
                <Setter Property="Placeholder" Value="Enter Value..."/>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>

        <!-- First Row: Labels and Entries -->
        <Label Grid.Row="0" Grid.Column="0" Style="{DynamicResource GridLabelStyle}" Text="First Name:"/>
        <Entry Grid.Row="0" Grid.Column="1" Style="{DynamicResource GridEntryStyle}" x:Name="FirstNameEntry"/>

        <Label Grid.Row="1" Grid.Column="0" Style="{DynamicResource GridLabelStyle}" Text="Last Name:"/>
        <Entry Grid.Row="1" Grid.Column="1" Style="{DynamicResource GridEntryStyle}" x:Name="LastNameEntry"/>

        <!-- Second Row: Button -->
        <Button Grid.Row="2" Grid.ColumnSpan="2" Text="Submit" BackgroundColor="#2196F3" FontColor="White" Margin="10,5,10,5" HorizontalOptions="Center" Clicked="OnGridSubmitClicked"/>

        <!-- Third Row: Message Label -->
        <Label Grid.Row="3" Grid.ColumnSpan="2" x:Name="GridMessageLabel" Style="{DynamicResource GridLabelStyle}" VerticalOptions="Start"/>
    </Grid>
</ContentPage>
  1. Implement OnGridSubmitClicked in MainPage.xaml.cs:
public void OnGridSubmitClicked(object sender, EventArgs e)
{
    string firstName = FirstNameEntry.Text?.Trim() ?? "";
    string lastName = LastNameEntry.Text?.Trim() ?? "";

    GridMessageLabel.Text = String.IsNullOrEmpty(firstName) || String.IsNullOrEmpty(lastName)
        ? "Please enter both names."
        : $"Hello {firstName} {lastName}!";
}

Step 4: Use RelativeLayout for Dynamic Sizing

Example: Positioning elements dynamically

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResponsiveUI.RelativePage"
             Title="Responsive UI with Relative">
    <ContentPage.Content>
        <RelativeLayout>

            <!-- Heading Label -->
            <Label Text="Relative Layout Example"
                   x:Name="HeadingLabel"
                   FontSize="Large"
                   HorizontalTextAlignment="Center"
                   RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.05}"
                   RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.1}"/>

            <!-- Email Entry -->
            <Entry Placeholder="Email"
                   x:Name="EmailEntry"
                   RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.8}"
                   RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=HeadingLabel, Property=Height, Constant=10}"
                   RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.1}"/>

            <!-- Password Entry -->
            <Entry Placeholder="Password"
                   x:Name="PasswordEntry"
                   IsPassword="True"
                   RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.8}"
                   RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=EmailEntry, Property=Height, Constant=10}"
                   RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.1}"/>

            <!-- Submit Button -->
            <Button Text="Login"
                    BackgroundColor="#FF9800"
                    FontColor="White"
                    RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.5, Constant=-50}"
                    RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=PasswordEntry, Property=Height, Constant=20}"
                    Clicked="OnRelativeLayoutSubmitClicked"/>

            <!-- Login Result Label -->
            <Label Text="Login result will appear here..."
                   FontSize="Medium"
                   HorizontalTextAlignment="Center"
                   x:Name="ResultLabel"
                   RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=Button, Property=Height, Constant=20}"
                   RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=X, Offset=10}"
                   RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Offset=-20}"/>

        </RelativeLayout>
    </ContentPage.Content>
</ContentPage>
  1. Implement OnRelativeLayoutSubmitClicked in your code file:
public void OnRelativeLayoutSubmitClicked(object sender, EventArgs e)
{
    var email = EmailEntry?.Text?.Trim() ?? "";
    var password = PasswordEntry?.Text?.Trim() ?? "";

    bool isValid = !string.IsNullOrWhiteSpace(email) && !string.IsNullOrWhiteSpace(password);

    ResultLabel.Text = isValid
        ? "Login successful!"
        : "Login failed! Please enter both email and password.";
}

Step 5: Handling Device-Specific Adjustments

Sometimes you may need to apply specific adjustments based on the device type or orientation.

Example: Differentiate between Landscape and Portrait Orientations

public override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height); // Important to call this

    if (width > height)
    {
        // Landscape logic
        ((FlexLayout)Content).Direction = FlexDirection.Row;
        ((FlexLayout)Content).Wrap = WrapMode.NoWrap;
    }
    else
    {
        // Portrait logic
        ((FlexLayout)Content).Direction = FlexDirection.Column;
        ((FlexLayout)Content).Wrap = WrapMode.Wrap;
    }
}

Ensure your root layout is set as FlexLayout in MainPage.xaml:

<ContentPage.Content>
    <FlexLayout Direction="Column" Wrap="Wrap">

        <Label Text="Welcome to FlexLayout"
               FontSize="Large"
               HorizontalOptions="Center"
               Margin="10"/>

        <Entry Placeholder="Email"
               Margin="10"
               HorizontalOptions="FillAndExpand"/>

        <Entry Placeholder="Password"
               IsPassword="True"
               Margin="10"
               HorizontalOptions="FillAndExpand"/>

        <Button Text="Login"
                BackgroundColor="#FF5722"
                FontColor="White"
                Margin="10,5,10,5"
                HorizontalOptions="Center"
                Clicked="OnFlexLayoutSubmitClicked"/>

        <Label Text="Login result will appear here..."
               x:Name="FlexLayoutMessageLabel"
               FontSize="Medium"
               HorizontalOptions="Center"
               Margin="10"/>
    </FlexLayout>
</ContentPage.Content>

Implement OnFlexLayoutSubmitClicked in MainPage.xaml.cs:

private void OnFlexLayoutSubmitClicked(object sender, EventArgs e)
{
    var email = ((Entry)FindByName<Entry>("EmailEntryFL")).Text?.Trim() ?? "";
    var password = ((Entry)FindByName<Entry>("PasswordEntryFL")).Text?.Trim() ?? "";

    bool isValid = !string.IsNullOrWhiteSpace(email) && !string.IsNullOrWhiteSpace(password);

    FlexLayoutMessageLabel.Text = isValid
        ? "Login successful!"
        : "Login failed! Please enter both email and password.";
}

In this example, the layout direction changes when the device orientation is switched. By using different constraints and properties, you can adapt the layout to various screen sizes and orientations.

Step 6: Dynamic Resource Adjustment with Device.RunningPlatform

Example: Apply platform-specific styling

You can use styles and resources to define platform-specific styling within your XAML files:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResponsiveUI.PlatformSpecificPage"
             Title="Platform Specific Styling">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style x:Key="MainHeadingStyle" TargetType="Label">
                <Style.Triggers>
                    <OnPlatform>
                        <On Platform="Android" SetMargin="10" SetText="Welcome to Android!"/>
                        <On Platform="iOS" SetMargin="20" SetText="Welcome to iOS!"/>
                        <On Platform="UWP" SetMargin="30" SetText="Welcome to UWP!"/>
                    </OnPlatform>
                </Style.Triggers>
            </Style>
            <Style x:Key="EntryStyle" TargetType="Entry">
                <Setter Property="Margin" Value="10"/>
                <Setter Property="Placeholder" Value="Enter your name...">
                    <Setter.PlatformConfiguration.iOS>
                        <PlatformConfiguration.SetTextColor Color="#808080"/>
                    </Setter.PlatformConfiguration.iOS>
                </Setter>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout>
        <Label Style="{DynamicResource MainHeadingStyle}"/>
        <Entry Style="{DynamicResource EntryStyle}"
               Placeholder="Name:"
               x:Name="PlatformSpecificEntry"/>

        <Button Text="Submit"
                BackgroundColor="#9C27B0"
                FontColor="White"
                Margin="10"
                HorizontalOptions="Center"
                Clicked="OnPlatformSpecificSubmitClicked"/>

        <Label Text="Your greeting will appear here..."
               x:Name="PlatformSpecificMessageLabel"
               HorizontalOptions="Center"
               Margin="10"/>
    </StackLayout>
</ContentPage>

Implement OnPlatformSpecificSubmitClicked in MainPage.xaml.cs:

private void OnPlatformSpecificSubmitClicked(object sender, EventArgs e)
{
    string name = PlatformSpecificEntry.Text != null ? PlatformSpecificEntry.Text.Trim() : "";
    PlatformSpecificMessageLabel.Text = String.IsNullOrEmpty(name) ? "Please enter your name." : $"Welcome {name}!";
}

In this example, OnPlatform triggers are used to apply different margins and text settings depending on the running platform.

Conclusion

Top 10 Interview Questions & Answers on Xamarin Forms Designing Responsive UI for Multiple Screen Sizes

1. What are the best practices for designing a responsive UI in Xamarin.Forms?

Answer: To design a responsive UI, start with flexible layouts using Grid, StackLayout, and RelativeLayout. Avoid fixed values for widths and heights; instead, utilize AbsoluteLayoutUnit.Star and Constraint to ensure elements scale proportionally. Additionally, use device-independent units (e.g., Device.OnPlatform for platform-specific adjustments) and media queries (via OnIdiom) to customize the appearance based on the screen characteristics.

2. How can I handle orientation changes in Xamarin.Forms?

Answer: Xamarin.Forms does not provide direct support for handling orientation changes explicitly due to cross-platform limitations. However, you can manage orientation changes by listening to property changes, such as Page.Width or Page.Height. Adjust your UI based on these properties. Another approach is to use custom renderers at the platform level if more control is needed.

3. Can I use XAML for responsive UI design?

Answer: Yes, XAML is quite effective for designing responsive UIs in Xamarin.Forms. By leveraging layouts like Grid and using relative sizes, you can define how controls should resize and reposition themselves based on the screen size and orientation. Utilize properties like AutoScaleFactor and GridUnitType.Star to achieve responsiveness.

4. What is the benefit of using Grid over StackLayout for responsive designs?

Answer: The Grid layout provides a more powerful way to arrange controls in rows and columns, with the ability to define relative sizes using GridUnitType.Star. This allows controls to take up proportional space, making it easier to create responsive designs that adapt to different screen sizes. StackLayout is simpler and useful for straightforward stacking, but Grid offers greater flexibility.

5. How do I handle images with different screen resolutions in Xamarin.Forms?

Answer: For handling images across multiple screen resolutions in Xamarin.Forms, ensure you include images at different densities (e.g., LowRes, MediumRes, HighRes). Use vector graphics (.svg) whenever possible, as they automatically scale to any resolution. Xamarin.Forms supports scalable images via embedded resources; make sure to use the correct file naming conventions (e.g., myimage.png, myimage@2x.png, myimage@3x.png) to specify different resolutions.

6. What are the steps to design a user interface that works well on tablets as well as phones?

Answer:

  • Begin with a layout that scales well on smaller screens.
  • Use GridUnitType.Star and proportional sizes in your layout definitions.
  • Utilize OnIdiom in XAML to apply different styles or layouts for Phone and Tablet.
  • Consider using FlexLayout for flexible arrangements that can adapt to different screen sizes and orientations.
  • Test on various devices and screen sizes to iterate and refine your layout.

7. How do I ensure that elements are not overlapped on larger screens?

Answer: To prevent element overlap on larger screens, use the Grid layout with defined row and column sizes and constraints. Employ Grid.ColumnSpan and Grid.RowSpan effectively to avoid overlapping. Alternatively, adjust padding and margins dynamically based on the screen size using bindings or trigger logic.

8. What is the role of OnPlatform in creating responsive UIs?

Answer: OnPlatform allows you to specify different resource values based on the target platform, which can be critical for responsive designs. For instance, you might want slightly different font sizes or paddings on Android and iOS to better fit the native UX guidelines. While it doesn't directly address screen size responsiveness, it aids in refining the experience across platforms.

9. How can I use styles to make my UI adaptable?

Answer: Styles in Xamarin.Forms allow you to define a set of properties that can be applied uniformly across multiple controls, simplifying the maintenance and adaptation of your UI. You can define different styles based on conditions (Triggers) or use DynamicResource references that change values depending on the device’s dimensions. This approach ensures that changing one value will affect all relevant controls, making your application easier to adjust for different screen sizes.

10. What tools or extensions can help in designing responsive UIs with Xamarin.Forms?

Answer: Several tools and extensions can enhance the design and responsiveness of your Xamarin.Forms apps:

  • Xamarin.Forms Previewer: Directly available in Visual Studio, this tool provides an instant preview of XAML layouts in real-time.
  • Sketch Plugin for Xamarin.Forms: Sketch, a popular design tool, has plugins for generating Xamarin.Forms code from designs, facilitating collaborative design processes.
  • Figma Plugins: Figma, another design tool, offers plugins that help convert designs into Xamarin.Forms code.
  • Refracture for SVGs: A plugin that allows you to import and use scalable vector graphics in Xamarin.Forms, ensuring images work well on any screen size without pixelation.
  • MVVMCross or similar frameworks: These can help centralize styling and layout decisions, making them easier to adjust globally.

You May Like This Related .NET Topic

Login to post a comment.