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

发布于 2024-10-22 02:17:23 字数 1808 浏览 1 评论 0原文

我正在为过程控制系统生成图形,我想创建一个系统边框,它可以在视觉上包裹过程模拟中显示的各种子系统。我可以为此使用常规边框,但我希望它不仅能够改变反映系统状态的颜色,而且还弹出小“气球”,指示处于警报状态的系统部分。

Process Mimic

我创建了一个带有用户控件的测试项目,并添加了一个 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>

I am producing graphics for a process control system and I would like to create a system border which would visually wrap the various sub system being displayed in the process mimic. I could use a regular border for this except I want it to not only changing color reflecting system status, but also popping up small "balloons" indicating the piece of the system that is in alarm state.

Process Mimic

I created a test project with a User Control and added a ListBox (for the balloons) and a ContentPresenter element wrapped in a border control. However, whenever I use this new control in another app, it wont allow me to add content to it. I've tried messing some with the ContentPropertyAttribute and properties of the ContentPresenter element, but I feel I am in the blind here.

<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>

I don't get it. What more should it need other than just the existence of a contentpresenter? UserControl subclasses ContentControl so I would have thought the wiring was in place. Eventually, I want it to be used something like this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦醒灬来后我 2024-10-29 02:17:23

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

让您的新控件继承自 ContentControl。

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

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

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

我发现了一个非常好的演练 这里

To create your own container control, you must create a new custom control (not a UserControl).

Make your new control inherit from ContentControl.

Custom Controls don't have their own XAML. Instead, they are assigned a ControlTemplate.

When you create your first Custom Control, the IDE will create a new file Themes\Generic.xaml.

This is where the template for your control is. You can modify this template to match the XAML in your question. This will support the ContentPresenter element.

I found a very good walkthrough here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文