Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I have a WPF TextBlock that has the same size for all font weights?

Tags:

wpf

textblock

I'll jump to the chase: Is there any way to tell the WPF TextBlock to measure itself such that its size doesn't change when its FontWeight changes?

I have a TextBlock that changes font weights dynamically based on a style. The TextBlock is inside a RadioButton so it is Bold when checked, Normal otherwise:

<Style x:Key="BoldWhenChecked" TargetType="RadioButton">
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="TextElement.FontWeight" Value="Bold" />
        </Trigger>
    </Style.Triggers>
</Style

and here are the radio buttons themselves:

<StackPanel Orientation="Horizontal">
    <RadioButton Style="{StaticResource BoldWhenChecked}">
        <TextBlock Text="Item 1" />
    </RadioButton>
    <RadioButton Style="{StaticResource BoldWhenChecked}">
        <TextBlock Text="Item 2" />
    </RadioButton>
    <RadioButton Style="{StaticResource BoldWhenChecked}">
        <TextBlock Text="Item 3" />
    </RadioButton>
    etc...
</StackPanel>

Unfortunately, since I am not using a fixed-width font the width of the TextBlock changes when the font weight changes, and the entire panel of radio buttons shifts accordingly, which is visually jarring.

like image 732
kcnygaard Avatar asked Dec 12 '13 23:12

kcnygaard


1 Answers

I created a work-around for this by adding a hidden TextBlock in the content of the RadioButton with its FontStyle explicitly set to Bold:

<RadioButton Style="{StaticResource BoldWhenChecked}">
    <Grid>
        <TextBlock Text="Item 1" />
        <TextBlock Text="Item 1" FontStyle="Bold" Visibility="Hidden" />
    </Grid>
</RadioButton>

That way when the RadioButton is selected and the visible TextBlock is made bold, the width does not change because the hidden TextBlock has already sized the grid appropriately.

like image 87
kcnygaard Avatar answered Nov 26 '22 19:11

kcnygaard