我正在为过程控制系统生成图形,我想创建一个系统边框,它可以直观地包裹过程模拟中显示的各个子系统。我可以使用常规边框,除了我希望它不仅可以改变颜色反映系统状态,还可以弹出小“气球”,表示系统处于报警状态。
我使用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>
答案 0 :(得分:4)
要创建自己的容器控件,您必须创建一个新的自定义控件(而不是UserControl)。
让您的新控件继承自ContentControl。
自定义控件没有自己的XAML。相反,它们被分配了一个ControlTemplate。
创建第一个自定义控件时,IDE将创建一个新文件Themes \ Generic.xaml。
这是您的控件的模板。您可以修改此模板以匹配问题中的XAML。这将支持ContentPresenter元素。
我找到了一个非常好的演练here。