WPF用户控件扩展边框类。 “不支持直接内容”?

时间:2011-03-16 21:36:15

标签: wpf xaml wpf-controls

我正在为过程控制系统生成图形,我想创建一个系统边框,它可以直观地包裹过程模拟中显示的各个子系统。我可以使用常规边框,除了我希望它不仅可以改变颜色反映系统状态,还可以弹出小“气球”,表示系统处于报警状态。

Process Mimic

我使用User Control创建了一个测试项目,并添加了一个ListBox(用于气球)和一个包装在边框控件中的ContentPresenter元素。但是,每当我在另一个应用程序中使用此新控件时,它都不允许我向其添加内容。我已经尝试使用ContentPropertyAttribute和ContentPresenter元素的属性搞乱一些,但我觉得我在这里是盲目的。

<UserControl x:Class="SystemStatusBorder.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Canvas Height="290" Width="303">        
        <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <ContentPresenter/>
        </Border>
        <ListBox Canvas.Right="0" Canvas.Bottom="0">
            <ListBox.RenderTransform>
                <TranslateTransform X="20"></TranslateTransform>
            </ListBox.RenderTransform>
            <ListBoxItem>TagA</ListBoxItem>
            <ListBoxItem>TagB</ListBoxItem>
        </ListBox>
    </Canvas>
</UserControl>

我不明白。除了内容提供者的存在之外,还需要什么呢? UserControl子类ContentControl,所以我认为布线已到位。最终,我想要使用这样的东西:

<SystemBorder>
  <SystemBorder.MonitoredTags>
        <List of relevant tags for the specific sub system goes here>
  </SystemBorder.MonitoredTags>
  <regular content goes here>  
</SystemBorder>

1 个答案:

答案 0 :(得分:4)

要创建自己的容器控件,您必须创建一个新的自定义控件(而不是UserControl)。

让您的新控件继承自ContentControl。

自定义控件没有自己的XAML。相反,它们被分配了一个ControlTemplate。

创建第一个自定义控件时,IDE将创建一个新文件Themes \ Generic.xaml。

这是您的控件的模板。您可以修改此模板以匹配问题中的XAML。这将支持ContentPresenter元素。

我找到了一个非常好的演练here