WPF中模板的继承

时间:2010-04-06 21:26:12

标签: wpf inheritance templates

我正在尝试确保给定元素(MPF.MWindow)的每个子元素都获得自定义模板。例如,按钮应该获得resMButton.xaml中定义的模板。截至目前,我正在使用以下代码:(resMWindow.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MPF">
    <Style x:Key="SystemKeyAnimations" TargetType="{x:Type Button}">
        <Setter Property="Opacity" Value="0.5" />
        <Setter Property="Background" Value="Transparent" />
        <Style.Triggers>
            <EventTrigger RoutedEvent="Mouse.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                                           Storyboard.TargetProperty="Opacity">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="1.0" />
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="Mouse.MouseLeave">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                                           Storyboard.TargetProperty="Opacity">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="0.5" />
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="{x:Type local:MWindow}">

        <!-- Remove default frame appearance -->
        <Setter Property="WindowStyle" Value="None" />
        <Setter Property="AllowsTransparency" Value="True" />
        <Setter Property="Background" Value="Transparent" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MWindow}">
                    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}" x:Name="ChromeBorder">

                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="4" />
                                <ColumnDefinition />
                                <ColumnDefinition Width="4" />
                            </Grid.ColumnDefinitions>

                            <Grid.RowDefinitions>
                                <RowDefinition Height="4" />
                                <RowDefinition />
                                <RowDefinition Height="4" />
                            </Grid.RowDefinitions>

                            <Thumb Grid.Row="0" Grid.Column="1" x:Name="TopThumb" Cursor="SizeNS" BorderThickness="4" BorderBrush="Transparent" />
                            <Thumb Grid.Row="2" Grid.Column="1" x:Name="BottomThumb" Cursor="SizeNS" BorderThickness="4" BorderBrush="Transparent" />
                            <Thumb Grid.Row="1" Grid.Column="0" x:Name="LeftThumb" Cursor="SizeWE" BorderThickness="4" BorderBrush="Transparent" />
                            <Thumb Grid.Row="1" Grid.Column="2" x:Name="RightThumb" Cursor="SizeWE" BorderThickness="4" BorderBrush="Transparent" />

                            <Thumb Grid.Row="0" Grid.Column="0" x:Name="TopLeftThumb" Cursor="SizeNWSE" BorderThickness="5" BorderBrush="Transparent" />
                            <Thumb Grid.Row="0" Grid.Column="2" x:Name="TopRightThumb" Cursor="SizeNESW" BorderThickness="5" BorderBrush="Transparent" />
                            <Thumb Grid.Row="2" Grid.Column="0" x:Name="BottomLeftThumb" Cursor="SizeNESW" BorderThickness="5" BorderBrush="Transparent" />
                            <Thumb Grid.Row="2" Grid.Column="2" x:Name="BottomRightThumb" Cursor="SizeNWSE" BorderThickness="5" BorderBrush="Transparent" />

                            <Grid Grid.Row="1" Grid.Column="1">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="20" />
                                    <RowDefinition />
                                </Grid.RowDefinitions>

                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>

                                    <StackPanel Orientation="Horizontal" Grid.Column="1">

                                        <Button Command="local:WindowCommands.Minimize" Style="{StaticResource ResourceKey=SystemKeyAnimations}">
                                            <Button.Template>
                                                <ControlTemplate>
                                                    <Canvas Width="10" Height="10" Margin="5" Background="Transparent">
                                                        <Line X1="0" X2="10" Y1="5" Y2="5" Stroke="White" StrokeThickness="2" />
                                                    </Canvas>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>

                                        <Button Command="local:WindowCommands.Maximize" x:Name="MaximizeButton" Style="{StaticResource ResourceKey=SystemKeyAnimations}">
                                            <Button.Template>
                                                <ControlTemplate>
                                                    <Canvas Width="10" Height="10" Margin="5" Background="Transparent">
                                                        <Rectangle Width="10" Height="10" Stroke="White" StrokeThickness="2" />
                                                    </Canvas>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>

                                        <Button Command="ApplicationCommands.Close" Style="{StaticResource ResourceKey=SystemKeyAnimations}">
                                            <Button.Template>
                                                <ControlTemplate>
                                                    <Canvas Width="10" Height="10" Margin="5" Background="Transparent">
                                                        <Line X1="0" X2="10" Y1="0" Y2="10" Stroke="White" StrokeThickness="2" />
                                                        <Line X1="10" X2="0" Y1="0" Y2="10" Stroke="White" StrokeThickness="2" />
                                                    </Canvas>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>

                                    </StackPanel>

                                    <ContentControl x:Name="TitleContentControl">
                                        <TextBlock Text="{TemplateBinding Title}" Foreground="DarkGray" Margin="5,0" />
                                    </ContentControl>
                                </Grid>

                                <ContentPresenter Content="{TemplateBinding Content}" Grid.Row="1">
                                    <ContentPresenter.Resources>
                                        <ResourceDictionary>
                                            <ResourceDictionary.MergedDictionaries>
                                                <ResourceDictionary Source="/MPF;component/Themes/resMWindowContent.xaml" />
                                            </ResourceDictionary.MergedDictionaries>
                                        </ResourceDictionary>
                                    </ContentPresenter.Resources>
                                </ContentPresenter>
                            </Grid>
                        </Grid>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>
</ResourceDictionary>

正如您在获取窗口内容的ContentPresenter期间所看到的那样,我合并了一个名为resMWindowContent.xaml的限制词。 resMWindowContent.xaml如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MPF">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/MPF;component/Themes/resMButton.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

它只是合并在resMButton.xaml字典中(这样做是因为在功能中我将有MTextBox,mList ......我想将它们分开)。

resMButton.xaml如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MPF">
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid Background="Transparent">
                        <Rectangle Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}"
                                   Fill="{TemplateBinding Background}" />
                        <ContentPresenter Content="{TemplateBinding Content}" Margin="3" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

绘制方形按钮的简单模板。但是,它根本没有应用。我的按钮保持正常,我不明白我做错了什么。我只是希望MWindow中的每个按钮都能获得一种特殊的风格(及时的每个文本框等等)。我如何实现这一目标?

但需要注意的是:样式不适用于MWindow之外的元素。

2 个答案:

答案 0 :(得分:1)

从样式元素中删除x:Key = "SystemKeyAnimations"

答案 1 :(得分:0)

你确定加载了什么resMButton.xaml?

相关问题