添加模板后,框架不再起作用

时间:2015-06-18 19:14:15

标签: c# wpf xaml

我正在尝试学习WPF,我为Frame创建了一个包含模板的资源字典,但在添加模板后,Frame未显示我的Pages不再。当我删除模板时,一切都再次起作用(页面正确显示)。我做错了什么?

ResourceDictionary.xaml(非常基本)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ControlTemplate x:Key="frameTemplate" TargetType="{x:Type Frame}">
    <Grid>
        <Border BorderBrush="Tomato" BorderThickness="3" Background="Bisque"/>
    </Grid>
</ControlTemplate>

</ResourceDictionary>

MainWindow.xaml

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/Icons.xaml" />
            <ResourceDictionary Source="ResourceDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<Controls:MetroWindow.RightWindowCommands>
    <Controls:WindowCommands>
        <ToggleButton Content="Menu" 
    IsChecked="{Binding ElementName=Flyout, Path=IsOpen}" Cursor="Hand"/>
    </Controls:WindowCommands>
</Controls:MetroWindow.RightWindowCommands>

<Grid>

    <Grid x:Name="menu_grid">
    </Grid>

    <!-- flyout here, the title bar is not overlapped -->
    <Controls:Flyout x:Name="Flyout"
                   Width="200"
                   Header="Menu"
                   IsOpen="True"
                   Position="Left">
        <StackPanel>
            <Button HorizontalContentAlignment="Center" VerticalAlignment="Center" Margin="10" Click="DriverButton_Click">
                <StackPanel Orientation="Horizontal">
                    <Rectangle Height="16" Width="16" Margin="5">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{StaticResource appbar_people}" Stretch="Fill" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Drivers</TextBlock>
                </StackPanel>
            </Button>
            <Button HorizontalContentAlignment="Center" VerticalAlignment="Center" Margin="10" Click="SeasonButton_Click">
                <StackPanel Orientation="Horizontal">
                    <Rectangle Height="16" Width="16" Margin="5">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{StaticResource appbar_calendar}" Stretch="Fill" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Seasons</TextBlock>
                </StackPanel>
            </Button>
            <Button HorizontalContentAlignment="Center" VerticalAlignment="Center" Margin="10" Click="ConstructorsButton_Click">
                <StackPanel Orientation="Horizontal">
                    <Rectangle Height="16" Width="16" Margin="5">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{StaticResource appbar_team}" Stretch="Fill" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Constructors</TextBlock>
                </StackPanel>
            </Button>
        </StackPanel>
    </Controls:Flyout>

    <Grid Margin="200 0 0 0">
        <Frame x:Name="_mainFrame" Template="{StaticResource frameTemplate}" />                
    </Grid>

</Grid>

MainWindow.xaml.cs

public partial class MainWindow 
{
    DriversPage driversPage = new DriversPage();
    SeasonPage seasonsPage = new SeasonPage();
    ConstructorsPage constructorsPage = new ConstructorsPage();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void DriverButton_Click(object sender, RoutedEventArgs e)
    {
        _mainFrame.Navigate(driversPage);
    }

    private void SeasonButton_Click(object sender, RoutedEventArgs e)
    {
        _mainFrame.Navigate(seasonsPage);
    }

    private void ConstructorsButton_Click(object sender, RoutedEventArgs e)
    {
        _mainFrame.Navigate(constructorsPage);
    }
}

1 个答案:

答案 0 :(得分:1)

当您覆盖ControlTemplate时,您需要提供控件的整个模板。您只提供Grid,其中包含Border,这就是所有要呈现的内容。如果您查看Frame的{​​{3}},您会发现其中有更多内容。我怀疑显示页面所需的重要部分可能是名为"PART_FrameCP"的内容演示者。尝试将其添加到模板中。

<ContentPresenter x:Name="PART_FrameCP" />

命名部件通常在模板中很重要,因为控件会查找它们。有时,未命名的部分也会按类型进行搜索,因此也很重要。在创建自己的模板时,最好先阅读并理解示例模板。