在WPF中为新基本窗口指定内容根

时间:2017-12-19 20:44:02

标签: wpf xaml

有没有办法指定"洞"用于WPF中的其他XAML内容?

例如,如果我使用布局创建MySuperWindowBase并且其中包含一些XAML,如何在MySuperWindowBase的子类中指定布局中的其他内容的位置?

简化示例

MySuperWindowBase:

<Window>
   <StackPanel>
     <!-- Force child content here -->
   </StackPanel>
</Window>

MyChildWindow:

<MySuperWindowBase>
    <TextBlock>Place me in the StackPanel</TextBlock>
</MySuperWindowBase>

2 个答案:

答案 0 :(得分:2)

你想要的是给基类窗口一个模板。 Gusdor的回答解释了所有内容,但是如何编写一个显示控件的Content属性的模板,所以这里是一个窗口控件模板的说明性示例。窗口的内容是您的ChildWindow.xaml文件中<Window></Window>元素内的任何内容:<TextBlock>Place me in the StackPanel</TextBlock>是您问题中的占位符内容。默认情况下,该XAML可视化树片段将分配给窗口的Content属性。

ContentPresenter控件显示内容。默认情况下,它会查看模板化父级的Content属性,但您可以通过将ContentPresenter的ContentSource属性设置为模板化父级的其他属性的名称来更改它。

<ControlTemplate TargetType="Window" x:Key="WindowBaseTemplate">
    <Grid>
        <Border 
            BorderBrush="Gray"
            BorderThickness="1"
            Margin="10"
            Padding="20"
            Background="GhostWhite"
            >
            <ContentPresenter
                />
        </Border>
    </Grid>
</ControlTemplate>

ContentPresenter看起来必须有魔力,但它只是默认值。

答案 1 :(得分:1)

  1. 为窗口创建新的Style - https://code.msdn.microsoft.com/windowsdesktop/WPF-styling-a-Window-in-fcf4e4ce
  2. 设置ContentTemplate属性以包含必填元素。
  3. 几乎所有其他方法都会导致您在某些时候遇到名称范围问题。