覆盖MahApps.Metro样式

时间:2018-12-11 12:38:51

标签: wpf visual-studio xaml designer mahapps.metro

我是编程新手,对不起我的英语。

我遇到了MahApps.Metro样式覆盖问题。
将样式添加到对话框控件时,Visual Studio中的XAML设计器为空(请参见下面的屏幕快照链接)。
看起来像是对话框,内容空白,没有文本和控件。

在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

在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

其中Dialog1Style是App.xaml中声明的ResourceDictionary文件,请根据以下提示创建提示:
How to change MahApps.Metro dialog content template width?
看起来像我自己的样式中的Template覆盖问题。

Visual Studio更新无济于事。
Windows 10是最新的。
我的Visual Studio 2017是社区版15.9.3,在专业版和企业版中也会出现此问题。

编辑:
创建新项目并添加mahapps.metro包后,我的app.xaml文件为空。
实际上是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>

和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>

1 个答案:

答案 0 :(得分:0)

好的样式问题,您可以通过"0"将初始不透明度设置为Storyoard,这是可以的,因为故事板会在运行时将不透明度设置为"1",但是如果您仍想显示复制我的样式,该样式将初始不透明度设置为"0",但是btoryboard将从"0"开始,因此没有明显区别。

<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>
  

奖金提示

根据MahApps文档,您应该在app.xaml.cs中添加这些资源,以便您也可以在样式之前添加此行,以加载一些默认设置。

<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>