2 Stimmen

WPF-Benutzersteuerelement, das die Border-Klasse erweitert. "Unterstützt keinen direkten Inhalt"?

Ich erstelle Grafiken für ein Prozesssteuerungssystem und möchte eine Systemumrandung erstellen, die die verschiedenen Teilsysteme, die in der Prozessdarstellung angezeigt werden, visuell einhüllt. Ich könnte dafür einen normalen Rahmen verwenden, aber ich möchte, dass er nicht nur die Farbe des Systemstatus ändert, sondern auch kleine "Sprechblasen" aufpoppen lässt, die den Teil des Systems anzeigen, der sich im Alarmzustand befindet.

Process Mimic

Ich habe ein Testprojekt mit einem Benutzersteuerelement erstellt und eine ListBox (für die Sprechblasen) und ein ContentPresenter-Element, das in ein Border-Steuerelement eingeschlossen ist, hinzugefügt. Allerdings, wann immer ich dieses neue Steuerelement in einer anderen Anwendung verwenden, es nicht zulassen, dass ich Inhalte hinzufügen. Ich habe versucht, einige mit dem ContentPropertyAttribute und Eigenschaften des ContentPresenter-Elements zu verwirren, aber ich fühle mich hier im Blindflug.

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

Das verstehe ich nicht. Was sollte es noch brauchen, außer der Existenz eines Contentpresenters? UserControl ist eine Unterklasse von ContentControl, also hätte ich gedacht, dass die Verkabelung vorhanden ist. Schließlich möchte ich es etwas wie dieses verwendet werden:

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

4voto

Andrew Shepherd Punkte 42283

Um Ihr eigenes Container-Steuerelement zu erstellen, müssen Sie ein neues benutzerdefiniertes Steuerelement (kein UserControl) erstellen.

Das neue Steuerelement soll von ContentControl erben.

Benutzerdefinierte Steuerelemente haben keine eigene XAML. Stattdessen wird ihnen ein ControlTemplate zugewiesen.

Wenn Sie Ihr erstes benutzerdefiniertes Steuerelement erstellen, erstellt die IDE eine neue Datei Themes \Generic.xaml.

Hier befindet sich die Vorlage für Ihr Steuerelement. Sie können diese Vorlage so ändern, dass sie der XAML in Ihrer Frage entspricht. Dadurch wird das ContentPresenter-Element unterstützt.

Ich habe eine sehr gute Komplettlösung gefunden ici .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X