WPF button size and font responsiveness

Viewed 28

I attempted to make a simple calculator app to start learning about WPF.

The issue that I am currently facing is that when I resize (Maximize, Minimize) the window the layout of my calculator app will change in a bad way. I cannot tell if it is the font of each button that is causing this issue or the overall layout of my XAML.

Here is the XAML:

<Window x:Class="Calculator.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    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"
    xmlns:local="clr-namespace:Calculator"
    mc:Ignorable="d"
    Title="Calculator" Height="600" Width="500"
    WindowStartupLocation="CenterScreen">

<!-- Container -->
<Grid Margin="10"
    Style="{StaticResource Root}"
    >
    
    <Grid.ColumnDefinitions>

        <ColumnDefinition
            Width="*"
            />
        <ColumnDefinition
            Width="30*"
            />
        <ColumnDefinition
            Width="*"
            />

    </Grid.ColumnDefinitions>
    
    <Grid.RowDefinitions>

        <RowDefinition
            Height="*"
            />
        <RowDefinition
            Height="16*"
            />
        <RowDefinition
            Height="32*"
            />
        <RowDefinition
            Height="*"
            />

    </Grid.RowDefinitions>

    <!-- Display -->
    <Border
        Grid.Column="1"
        Grid.Row="1"
        Style="{StaticResource Display}"
        >

        <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition 
                Width="*"
                />

            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>

                <RowDefinition 
                Height="*"
                />

                <RowDefinition 
                Height="2*"
                />

            </Grid.RowDefinitions>

            <Label
                x:Name="Label_DisplayNumber"
                Content="0"
                HorizontalAlignment="Right"
                VerticalAlignment="Center"
                Grid.Column="0"
                Grid.Row="1"
                FontSize="75"
                Foreground="#183B5D"
                Margin="0, 0, 20, 0"
                />
            
            <Label
                x:Name="Label_DisplayOperation"
                Content=""
                HorizontalAlignment="left"
                VerticalAlignment="Center"
                Grid.Column="0"
                Grid.Row="0"
                FontSize="40"
                Foreground="#183B5D"
                Margin="20, 0, 0, 0"
            />
            
        </Grid>

    </Border>


    <!-- Controls -->
    <Grid
        Grid.Column="1"
        Grid.Row="2"
        Style="{StaticResource Interface}"
        >
        
        <Grid.ColumnDefinitions>

            <ColumnDefinition 
                Width="*"
                />

            <ColumnDefinition 
                Width="*"
                />

            <ColumnDefinition 
                Width="*"
                />

            <ColumnDefinition 
                Width="*"
                />

        </Grid.ColumnDefinitions>
        
        <Grid.RowDefinitions>

            <RowDefinition 
                Height="*"
                />

            <RowDefinition 
                Height="*"
                />

            <RowDefinition 
                Height="*"
                />

            <RowDefinition 
                Height="*"
                />

            <RowDefinition 
                Height="*"
                />

        </Grid.RowDefinitions>

        <!-- Buttons_Numbers -->
        <Button
            Content="0"
            Grid.Column="0"
            Grid.ColumnSpan="2"
            Grid.Row="4"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="1"
            Grid.Column="0"
            Grid.Row="3"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="2"
            Grid.Column="1"
            Grid.Row="3"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="3"
            Grid.Column="2"
            Grid.Row="3"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="4"
            Grid.Column="0"
            Grid.Row="2"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="5"
            Grid.Column="1"
            Grid.Row="2"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="6"
            Grid.Column="2"
            Grid.Row="2"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="7"
            Grid.Column="0"
            Grid.Row="1"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="8"
            Grid.Column="1"
            Grid.Row="1"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />
        
        <Button
            Content="9"
            Grid.Column="2"
            Grid.Row="1"
            Style="{StaticResource Button_Number}"
            Click="Button_Click_Number"
            />

        <!-- Buttons_Operators -->
        <Button
            Content="AC"
            Grid.Column="0"
            Grid.ColumnSpan="2"
            Grid.Row="0"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_AllClear"
            />
        
        <Button
            Content="+/-"
            Grid.Column="2"
            Grid.Row="0"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_SignConversion"
            />
        
        <Button
            Content="/"
            Grid.Column="3"
            Grid.Row="0"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Operator"
            />
        
        <Button
            Content="*"
            Grid.Column="3"
            Grid.Row="1"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Operator"
            />

        <Button
            Content="-"
            FontStretch="UltraExpanded"
            Grid.Column="3"
            Grid.Row="2"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Operator"
            />

        <Button
            Content="+"
            Grid.Column="3"
            Grid.Row="3"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Operator"
            />
        <Button
            Content="="
            Grid.Column="3"
            Grid.Row="4"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Equal"
            />
        <Button
            Content="."
            Grid.Column="2"
            Grid.Row="4"
            Style="{StaticResource Button_Operator}"
            Click="Button_Click_Period"
            />

    </Grid>

</Grid>

Here is how the calculator app looks in normal size:

Here is how the calculator app looks when the window is maximized:

I am not exactly sure what is causing it to look so bad when the window is maximized. It seems to me that my buttons are stretching way too much which makes them look wide and the font inside very small. So here are my questions:

  1. How can I improve the layout to make it better?

  2. Does the "Button" element contain a property that allows the font inside it to stretch so that it won't look so small on maximized windows?

1 Answers

You can use Viewbox to make the content of a Button fill the Button and adjust its size against the Button by setting Padding.

For example, edit ControlTemplate of Button to insert a Viewbox which hosts the ContentPresenter.

<Style x:Key="Button_Number" TargetType="{x:Type Button}">
    <Setter Property="Padding" Value="10"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        SnapsToDevicePixels="true">
                    <Viewbox Margin="{TemplateBinding Padding}"
                             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                             VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                        <ContentPresenter x:Name="contentPresenter"
                                          Focusable="False"
                                          RecognizesAccessKey="True"/>
                    </Viewbox>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Related