【问题标题】:WPF How do I add items to a window that was based on a windows template?WPF 如何将项目添加到基于 Windows 模板的窗口?
【发布时间】:2016-05-03 15:12:20
【问题描述】:

我创建了一个窗口控件模板,因此我的应用程序中的每个窗口都将在顶部共享相同的菜单,在底部共享版权以及整体外观(颜色等)。当我创建一个新窗口并将模板应用到它时,新窗口看起来像预期的模板,但我无法向窗口添加任何新内容。我拖到新窗口上的任何东西都是不可见的(即 XAML 显示了我添加的控件,但我在窗口上看不到它)。模板不是要走的路吗?正如我上面提到的,我试图让每个窗口使用相同的菜单并具有相同的布局(颜色,底部的版权文本框)。除此之外,我希望能够将与每个特定窗口相关的其他项目放在“模板化”窗口上。似乎足够基本,但作为一个试图掌握 WPF(并且绝对喜欢 WPF)的 VB 6 人,我错过了如何实现这一点。任何帮助表示赞赏。下面是我的模板代码,然后是如何使用该模板设置新窗口。

模板(在 Application.Resources 中)

<Style x:Key="WindowTemplateMain" TargetType="{x:Type Window}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Window}">
            <DockPanel Margin="0,0,-1.667,0.333" HorizontalAlignment="Stretch" Width="Auto">
                <DockPanel.Background>
                    <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                        <GradientStop Color="#FFAEC2EE" Offset="0"/>
                        <GradientStop Color="#FFFEFEFE" Offset="1"/>
                    </LinearGradientBrush>
                </DockPanel.Background>
                <Menu DockPanel.Dock="Top">
                    <MenuItem Header="_File">
                        <MenuItem Header="_Time Entry" Name="mnu_TimeEntry" Click="mnu_TimeEntry" />
                        <Separator />
                        <MenuItem Header="_Logout" Click="mnu_LogoutClick"/>
                        <Separator />
                        <MenuItem Header="_Exit" Click="mnu_ExitClick"/>
                    </MenuItem>
                    <MenuItem Header="_Reports">
                        <MenuItem Header="_Report1" />
                        <MenuItem Header="_Report2" />
                        <MenuItem Header="_Report3" />
                    </MenuItem>
                    <MenuItem Header="_Administration">
                        <MenuItem Header="_Task1" />
                        <MenuItem Header="_Task2" />
                        <MenuItem Header="_Task3" />
                    </MenuItem>
                </Menu>
                <Grid Margin="0,0,0,0" Width="Auto">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="74*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="3*"/>
                    </Grid.RowDefinitions>
                    <TextBlock Style="{StaticResource MWB_Copyright}" Grid.Row="2" Grid.ColumnSpan="2" Margin="5,0,4.666,4" />
                </Grid>
            </DockPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>

带有“已应用”模板的新窗口:

<Window x:Class="MWB_TimeKeeper_Main"
    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:MWB_TimeKeeper"
    mc:Ignorable="d"
    Title="MWB TimeKeeper Main"
    Style="{DynamicResource WindowTemplateMain}" >
    <Button x:Name="MyButton" Content="MyButton" Height="100" Width="75"/>
</Window>

“MyButton”按钮是我从工具箱中拖出来的,它显示在 XAML 代码中,但没有显示在窗口中。同样,我确定我只是没有正确使用模板或需要使用某种类型的样式/模板组合,但我无法弄清楚并且已经在网上搜索了一段时间。

提前感谢您的帮助!

【问题讨论】:

标签: wpf xaml templates styles


【解决方案1】:

克里斯 W 是对的。

将内容演示者添加到您的内容模板中,如下所示。我测试过了,按钮显示出来了。

注意:我已经删除了点击事件来测试代码。

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style x:Key="WindowTemplateMain" TargetType="{x:Type Window}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <DockPanel Margin="0,0,-1.667,0.333" HorizontalAlignment="Stretch" Width="Auto">
                            <DockPanel.Background>
                                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                                    <GradientStop Color="#FFAEC2EE" Offset="0"/>
                                    <GradientStop Color="#FFFEFEFE" Offset="1"/>
                                </LinearGradientBrush>
                            </DockPanel.Background>
                            <Menu DockPanel.Dock="Top">
                                <MenuItem Header="_File">
                                    <MenuItem Header="_Time Entry" Name="mnu_TimeEntry" />
                                    <Separator />
                                    <MenuItem Header="_Logout" />
                                    <Separator />
                                    <MenuItem Header="_Exit" />
                                </MenuItem>
                                <MenuItem Header="_Reports">
                                    <MenuItem Header="_Report1" />
                                    <MenuItem Header="_Report2" />
                                    <MenuItem Header="_Report3" />
                                </MenuItem>
                                <MenuItem Header="_Administration">
                                    <MenuItem Header="_Task1" />
                                    <MenuItem Header="_Task2" />
                                    <MenuItem Header="_Task3" />
                                </MenuItem>
                            </Menu>
                            <Grid Margin="0,0,0,0" Width="Auto">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="74*"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="3*"/>
                                </Grid.RowDefinitions>
                                <TextBlock Grid.Row="2" Grid.ColumnSpan="2" Margin="5,0,4.666,4" />
                            </Grid>
                            <ContentPresenter>

                            </ContentPresenter>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>
</Application>

【讨论】:

  • 太棒了!我知道这很简单,只是找不到合适的教程。我刚刚测试了它,它就像你提到的那样工作。谢谢!
猜你喜欢
  • 2011-11-12
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多