Search code examples
wpfvisual-studioxamldesignermahapps.metro

VS 2017 XAML Designer blank when override MahApps.Metro Style


i'm new in programming and sorry for my english.

I have problem with MahApps.Metro Style overriding.
XAML Designer in Visual Studio is blank when added Style to Dialog control (see screenshots links below).
It's looks like dialog with empty content, without text and controls.

Before adding Style in CustomDialog

Dialog1.xaml

<Dialog:CustomDialog x:Class="DesignerTestWithStyle.Dialog1"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                   xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                   xmlns:local="clr-namespace:DesignerTestWithStyle"
                   xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
                   xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
                   mc:Ignorable="d" 
                   d:DesignHeight="150" d:DesignWidth="250"

                   >
<Grid>
    <StackPanel>
        <Button Content="Test"/>
        <Label Content="Test text"/>
        <TextBox Text="I don't see this text"/>
    </StackPanel>
</Grid>


Works fine

After adding Style in CustomDialog

Dialog1.xaml

    <Dialog:CustomDialog x:Class="DesignerTestWithStyle.Dialog1"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                   xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                   xmlns:local="clr-namespace:DesignerTestWithStyle"
                   xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
                   xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
                   mc:Ignorable="d" 
                   d:DesignHeight="150" d:DesignWidth="250"
                   Style="{StaticResource Dialog1Style}"
                   >
<Grid>
    <StackPanel>
        <Button Content="Test"/>
        <Label Content="Test text"/>
        <TextBox Text="I don't see this text"/>
    </StackPanel>
</Grid>


XAML Designer is blank, without controls

Where Dialog1Style is a ResourceDictionary file declared in App.xaml, create from tips from this ask:
How to change MahApps.Metro dialog content template width?
It's looks like problem with Template overriding in my own Style.

Visual Studio update doesn't help.
Windows 10 is up to date.
My Visual Studio 2017 is Community Edition 15.9.3, the problem also occurs in the Professional and Enterprise Edition.

Edit:
my app.xaml file was empty after create new project and added mahapps.metro package.
Actually app.xaml:

<Application x:Class="DesignerTestWithStyle.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:DesignerTestWithStyle"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Styles/Dialog1Style.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

and Dialog1Style.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:DesignerTestWithStyle.Styles"
                xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
                >
<Style TargetType="{x:Type Dialog:BaseMetroDialog}"
    x:Key="Dialog1Style"
    BasedOn="{StaticResource {x:Type Dialog:BaseMetroDialog}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Dialog:BaseMetroDialog}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="DialogShownStoryboard">
                        <DoubleAnimation AccelerationRatio=".9"
                                        BeginTime="0:0:0"
                                        Duration="0:0:0.2"
                                        Storyboard.TargetProperty="Opacity"
                                        To="1" />
                    </Storyboard>
                </ControlTemplate.Resources>
                <Grid Background="{TemplateBinding Background}">
                    <Border FocusVisualStyle="{x:Null}"
                        Focusable="False">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <ContentPresenter Grid.Row="0"
                                            Content="{TemplateBinding DialogTop}" />
                            <Grid Grid.Row="1">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="10*" />
                                    <ColumnDefinition Width="80*" />
                                    <ColumnDefinition Width="10*" />
                                </Grid.ColumnDefinitions>
                                <!--  Content area  -->
                                <Grid Grid.Column="1"
                                    Margin="0 10 0 0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <TextBlock Grid.Row="0"
                                            FontSize="{DynamicResource DialogTitleFontSize}"
                                            Foreground="{TemplateBinding Foreground}"
                                            Text="{TemplateBinding Title}"
                                            TextWrapping="Wrap" />
                                    <ContentPresenter Grid.Row="1"
                                                    Content="{TemplateBinding Content}" />
                                </Grid>
                            </Grid>
                            <ContentPresenter Grid.Row="2"
                                            Content="{TemplateBinding DialogBottom}" />
                        </Grid>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard Storyboard="{StaticResource DialogShownStoryboard}" />
                        </EventTrigger.Actions>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


Solution

  • Okay problem in style you set initial opacity to "0" through Storyoard it is okay, because your storyboard will set opacity to "1" in run time, but if you still want to show copy my style which set initial opacity to "0" but btoryboard will begin it from "0" so no difference will be noticeable.

    <Style TargetType="{x:Type Dialog:BaseMetroDialog}" x:Key="Dialog1Style" BasedOn="{StaticResource {x:Type Dialog:BaseMetroDialog}}">
        <Setter Property="Opacity" Value="1" /> <!-- Problem is here -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Dialog:BaseMetroDialog}">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="DialogShownStoryboard">
                            <DoubleAnimation AccelerationRatio=".9" BeginTime="0:0:0" Duration="0:0:0.5" Storyboard.TargetProperty="Opacity" From="0" To="1" />
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Grid Background="{TemplateBinding Background}">
                        <Border FocusVisualStyle="{x:Null}" Focusable="False">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="*" />
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>
                                <ContentPresenter Grid.Row="0" Content="{TemplateBinding DialogTop}" />
                                <Grid Grid.Row="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="10*" />
                                        <ColumnDefinition Width="80*" />
                                        <ColumnDefinition Width="10*" />
                                    </Grid.ColumnDefinitions>
                                    <!--  Content area  -->
                                    <Grid Grid.Column="1" Margin="0 10 0 0">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="*" />
                                        </Grid.RowDefinitions>
                                        <TextBlock Grid.Row="0"
                                            FontSize="{DynamicResource DialogTitleFontSize}" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Title}" TextWrapping="Wrap" />
                                        <ContentPresenter Grid.Row="1" Content="{TemplateBinding Content}" />
                                    </Grid>
                                </Grid>
                                <ContentPresenter Grid.Row="2" Content="{TemplateBinding DialogBottom}" />
                            </Grid>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <EventTrigger.Actions>
                                <BeginStoryboard Storyboard="{StaticResource DialogShownStoryboard}" />
                            </EventTrigger.Actions>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    Bonus Tip

    as per MahApps Documentation you should add theses resources in app.xaml.cs so you can add this line also before your style, for loading some defaults.

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                <!-- Accent and AppTheme setting  -->
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    
                <!-- Your Style -->
                <ResourceDictionary Source="Dialog1Style.xaml" />
            </ResourceDictionary.MergedDictionaries>
    
        </ResourceDictionary>
    </Application.Resources>