0
votes

I'm trying to add a global style (Font size and Font family) into my WPF application for Window I have, but no style Is applied to It, whatever I do. I think my problem Is that my startup Window Is not App.xaml, because I use App.xaml just to check If user has permission to run application. But right after that my desired Window opens, so StartupUri in my App.xaml Is set to that Window.

Here is my App.xaml:

<Application x:Class="MyApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyApp"
             StartupUri="FirstWindowToShow.xaml">

    <Application.Resources>

        <!--Style that should be applied to all Windows-->
        <Style x:Key="Win_style" TargetType="{x:Type Window}">
            <Setter Property="FontFamily" Value="Comic Sans MS" />
            <Setter Property="FontSize" Value="14" />
        </Style>

        <!--Style for all Pages - works fine-->
        <Style x:Key="PageFont" TargetType="{x:Type Page}">
            <Setter Property="FontFamily" Value="Comic Sans MS" />
            <Setter Property="FontSize" Value="12" />
        </Style>

    </Application.Resources>

</Application>

And here is my FirstWindowToShow.xaml :

   <Window x:Class="MyApp.FirstWindowToShow"
        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:Priprava_Podatkov"
        mc:Ignorable="d"
        Title="Some title" Height="480" Width="800" Loaded="Window_Loaded" Background="#FFF9F9F9" OpacityMask="Black">

    <Grid>

        <Menu x:Name="G_Menu" HorizontalAlignment="Left" VerticalAlignment="Top" Height="20" Width="792">
            <MenuItem x:Name="Menu_Program">
                <MenuItem x:Name="Menu_V" Header="About" Click="Menu_V_Click"/>
                <MenuItem x:Name="Menu_End" Header="Close" Click="Menu_End_Click"/>
            </MenuItem>
            <MenuItem Header="Department 1" Height="20" Width="148">
                <MenuItem x:Name="Dept_1" Header="Custom controlling" Click="Dept_1_Click"/>
            </MenuItem>
        </Menu>
        <Frame x:Name="Frame_s" HorizontalAlignment="Stretch" VerticalAlignment="Top" Width="772" NavigationUIVisibility="Hidden"/>

        <StatusBar DockPanel.Dock="Bottom" Margin="0,386,0,0" VerticalAlignment="Bottom" Background="Transparent">
            <StatusBarItem Width="73">
                <Label Content="User:" FontWeight="Bold" Width="73"/>
            </StatusBarItem>
            <StatusBarItem>
                <Label x:Name="LblU" Content="user" FontWeight="Light"/>
            </StatusBarItem>
            <StatusBarItem>
                <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" Height="10" />
            </StatusBarItem>
            <StatusBarItem>
                <Label Content="User permissions:" FontWeight="Bold" />
            </StatusBarItem>
            <StatusBarItem>
                <Label x:Name="LblN" Content="Rights" FontWeight="Light"/>
            </StatusBarItem>
            <StatusBarItem >

                <Label x:Name="Lbl_P" Content="Data exported..." >
                    <Label.Style>
                        <Style TargetType="{x:Type Label}">
                            <Style.Resources>
                                <Storyboard x:Key="flashAnimacija">
                                    <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" AutoReverse="True" Duration="0:0:1.5" RepeatBehavior="Forever" />
                                </Storyboard>
                            </Style.Resources>

                            <Setter Property="Visibility" Value="Hidden" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ElementName= Progress_DoKonca, Path= IsVisible}" Value="True">
                                    <Setter Property="Visibility" Value="Visible" />
                                    <DataTrigger.EnterActions>
                                        <BeginStoryboard Name="flash" Storyboard="{StaticResource flashAnimacija}" />
                                    </DataTrigger.EnterActions>
                                    <DataTrigger.ExitActions>
                                        <StopStoryboard BeginStoryboardName="flash"/>
                                    </DataTrigger.ExitActions>
                                </DataTrigger>

                            </Style.Triggers>
                        </Style>
                    </Label.Style>
                </Label>
            </StatusBarItem>
            <StatusBarItem HorizontalAlignment="Right" Margin="-10,0,10,0">
                <Grid>
                    <ProgressBar x:Name="Progress_TillEnd" Width="150" Height="20" />
                    <TextBlock x:Name="Progress_Txt" Text="{Binding ElementName=Progress_DoKonca, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Grid>
            </StatusBarItem>
        </StatusBar>
    </Grid>
</Window>

I have been trying all sorts of things in code or XAML, like this or this, but still with no success. What am I doing wrong ?

3
When you say 'no style is applied', do your existing controls have default font e.g. Arial? Or the control text is not visible? Can you remove the Foreground="{x:Null}" from the FirstWindowToShow and try?Insane
@Insane, I posted full Window code since It's not that long. I have been trying to delete everything I came up with, but desired font just Isn't showing inside Window. I have tried Foreground="{x:Null}" too.Lucy82
Looks like StatusBar and Menu are causing me problems. Everything Is fine If I set their styles manually. Strangely style for Pages work, but I have no StatusBar or Menu there,Lucy82
Each window you have is not typed as a window. It is a MainWindow or a Window1 or whatever. Hence your style will target none. Simplest approach is to give the style a key and explicitly reference it in each window.Andy
@Andy, how do you mean that ? My FirstWindowToShow inhertis from Wind class. I tried even <Style x:Key="Win_style" TargetType="local:FirstWindowToShow">.Lucy82

3 Answers

2
votes

This is what I've done in the past, so see if it works for you:

In your App.xaml, remove the x:Key from the Window style, so it becomes:

    <!--Style that should be applied to all Windows-->
    <Style TargetType="{x:Type Window}">
        <Setter Property="FontFamily" Value="Comic Sans MS" />
        <Setter Property="FontSize" Value="14" />
    </Style>

Then in your App.xaml.cs (code-behind), override the OnStartup method and add this code:-

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
        {
            DefaultValue = FindResource(typeof(Window))
        });
    }

This will apply those styles in the App.xaml Window style (i.e. FontFamily and FontStyle) to all windows created by the application.

1
votes

For the controls like Menu and StatusBar it is necessary to set the style explicitly like below:

<Style  x:Key="BaseStyle" TargetType="{x:Type Control}">
   <Setter Property="FontFamily" Value="Comic Sans MS" />
   <Setter Property="FontSize" Value="13" />   
</Style>

<Style TargetType="{x:Type StatusBar}" BasedOn="{StaticResource BaseStyle}" />        
<Style TargetType="{x:Type Menu}" BasedOn="{StaticResource BaseStyle}" />        
<Style TargetType="{x:Type local:Window1}" BasedOn="{StaticResource BaseStyle}" />
0
votes

Why would a Style with an x:Key of "Win_style" be applied to all windows?

You could keep Win_style and define an implict Style per window type (e.g. FirstWindowToShow) that is based on Win_style:

<Application.Resources>

    <!--Style that should be applied to all Windows-->
    <Style x:Key="Win_style" TargetType="{x:Type Window}">
        <Setter Property="FontFamily" Value="Comic Sans MS" />
        <Setter Property="FontSize" Value="14" />
    </Style>

    <!-- implicit window styles, one for each window -->
    <Style TargetType="{x:Type local:FirstWindowToShow}" BasedOn="{StaticResource Win_style}" />

    <!--Style for all Pages - works fine-->
    <Style x:Key="PageFont" TargetType="{x:Type Page}">
        <Setter Property="FontFamily" Value="Comic Sans MS" />
        <Setter Property="FontSize" Value="12" />
    </Style>

</Application.Resources>