将一个充满控件的模板添加到另一个WPF控件

时间:2013-01-04 12:39:43

标签: wpf wpf-controls

所以我一直在开发一个项目,允许我在选项卡控件和每个新TabItem中添加选项卡。我有一堆以编程方式生成的控件。有没有办法在XAML中创建一个模板,我可以简单地添加到新创建的TabItem

举一个简单的例子,假设我有一个带有TabPage的WPF表单:

<Window>
 <Grid>
  <TabControl></Tabcontrol>
 </Grid> 
</Window>

我想在每个TabPages中添加3个按钮。

<Window>
 <Grid>
  <TabControl>
   <TabItem>
    <Button/>
    <Button/>
    <Button/>
   </TabItem>
  </TabControl>
 </Grid> 
</Window>

我希望能够在XAML编辑器(可能是VS2012)中编辑3个按钮的模板,这些更改将反映在添加到每个TabItem的模板中。

我环顾四周,大多数WPF模板文章都是关于着色或样式模板的,这似乎不是我想要的。按照我目前的方法,以编程方式添加TabItem但是使编辑模板更加麻烦,而且我认为,与WPF的理念相反:将代码与设计断开连接。

我对WPF很新,但已经看到它在WinForms上的强大功能和优势,所以我在那条大道上卖了但是因为我是新手,我的术语有时候有点混乱,这也使我试图搜索失败,不时。

任何帮助将不胜感激。如果我没有充分解释,请告诉我。

4 个答案:

答案 0 :(得分:1)

您可以尝试使用UserControl

它允许您使用 - 例如 - 一组三个按钮作为简单控件。 它由xaml文件定义,对此xaml文件的更改将反映在添加了usercontrol的任何位置。

答案 1 :(得分:1)

正如@Olwaro所提到的,你可能想要使用UserControl

根据您的示例,您可以使用此Xaml UserControl(其中用户控件名为ThreeButtonStack,位于名称空间WpfApplication2中):

<UserControl x:Class="WpfApplication2.ThreeButtonStack"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="5" />
            <Setter Property="Width" Value="75" />
        </Style>
    </UserControl.Resources>
    <StackPanel Orientation="Horizontal">
        <Button Content="OK" />
        <Button Content="Cancel" />
        <Button Content="Retry" />
    </StackPanel>
</UserControl>

然后你可以在你的主应用程序中调用它:

<Window x:Class="WpfApplication2.TabPageWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication2="clr-namespace:WpfApplication2"
        Title="TabPageWindow" Height="300" Width="300">
    <TabControl>
        <TabItem Header="Tab 1">
            <DockPanel>
                <wpfApplication2:ThreeButtonStack DockPanel.Dock="Bottom" HorizontalAlignment="Right"/>
                <TextBlock>Custom Content</TextBlock>
            </DockPanel>
        </TabItem>
        <TabItem Header="Tab 2">
            <DockPanel>
                <wpfApplication2:ThreeButtonStack DockPanel.Dock="Bottom" HorizontalAlignment="Right"/>
                <TextBox>Editing custom stuff</TextBox>
            </DockPanel>
        </TabItem>
    </TabControl>
</Window>

结果将是:

Screenshot

答案 2 :(得分:1)

TabItem 最终继承自 ContentControl ,这意味着您可以以可以装饰内容控件中显示的实际内容的方式对其进行模板制作:

<Style TargetType="TabItem">
  <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabItem}">
          <Grid>
            <Grid.RowDefinitions>
              <RowDefinition Height="*" />
              <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <ContentPresenter Grid.Row="0" />
            <StackPanel Grid.Row=1>
              <!-- Your buttons -->
            </StackPanel>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

放置 ContentPresenter 的位置是ContentControl的内容(或在本例中为TabItem)的放置位置。

我们使用此功能将搜索/突出显示功能添加到集合显示中。您可能希望复制默认模板并从那里进行修改 - 这是一个丑陋的部分,因为在模板中练习标记重用相当困难。

或者,您可以保留TabItem,并以TabItems中使用的所需方式设置ContentControl的样式...

<TabItem>
  <ContentControl Style="{StaticResource CommonButtons}">
    <!-- TabItem Contents -->
  </ContentControl>
</TabItem>

当然,ContentControl位最终会出现在DataTemplate中,并且绑定到 ItemsSource 最终会出现

<TabControl 
   ItemTemplate="{StaticResource CommonButtonsTemplate}" 
   ItemsSource="{Binding MyTabItemsData}" />

答案 3 :(得分:0)

我对类TabPage没有任何想法,但要解决这类问题,最好创建一个继承TabPage并在其中工作的类,并在其中设置常用功能,而不是使用Templateing。我希望这样做帮助