Exemplarische Vorgehensweise: Ändern des Verhaltens einer Eigenschaft zur Entwurfszeit
Wenn Sie den WPF Designer für Visual Studio mithilfe der Erweiterbarkeit anpassen, ist es häufig notwendig, benutzerdefinierte Steuerelemente zu erstellen. Manchmal soll sich eine Eigenschaft des Steuerelements zur Entwurfszeit anders verhalten als zur Laufzeit, wobei der Benutzer jedoch den Wert der Eigenschaft auf normale Weise festlegen kann. Beispielsweise soll der Benutzer die visible-Eigenschaft eines Steuerelement auf false festlegen können, das Steuerelement soll jedoch trotzdem zur Entwurfszeit sichtbar sein.
In dieser exemplarischen Vorgehensweise erstellen Sie ein benutzerdefiniertes Button-Element und ändern das Verhalten der Background-Eigenschaft und der Content-Eigenschaft. Um dies zu erreichen, erstellen Sie einen DesignModeValueProvider und fügen diesen an das benutzerdefinierte Steuerelement an. Der DesignModeValueProvider erfasst vom Benutzer vorgenommene Eigenschaftenänderungen, Sie fügen Ihre eigene Logik in die TranslatePropertyValue-Methode ein, und der DesignModeValueProvider übergibt die neuen Werte an den Designer.
Wichtig
Wenn Sie dieses Verfahren verwenden, entspricht das Verhalten einer Eigenschaft im Designer nicht dem Wert der Eigenschaft in der XAML-Ansicht. In der XAML-Ansicht wird der Wert angezeigt, den der Benutzer zur Entwurfszeit eingegeben hat. Der Wert in der XAML-Ansicht stellt das Verhalten dar, das die Eigenschaft zur Laufzeit zeigt.
Im Verlauf dieser exemplarischen Vorgehensweise führen Sie folgende Aufgaben aus:
Erstellen eines benutzerdefinierten WPF-Steuerelementbibliothek-Projekts
Erstellen eines benutzerdefinierten DesignModeValueProvider
Erstellen eines benutzerdefinierten Schaltflächensteuerelements
Hinzufügen des DesignModeValueProvider zum benutzerdefinierten Steuerelement
Erstellen einer Testanwendung
Testen des benutzerdefinierten Steuerelements
Tipp
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.
Vorbereitungsmaßnahmen
Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:
- Visual Studio 2010
Erstellen eines benutzerdefinierten WPF-Steuerelementbibliothek-Projekts
So erstellen Sie das Projekt
Erstellen Sie ein neues benutzerdefiniertes WPF-Steuerelementbibliothek-Projekt in Visual Basic oder Visual C# mit dem Namen CustomButton.
Der Code für CustomControl1 wird im Code-Editor geöffnet.
Fügen Sie einen Verweis auf die folgende Assembly hinzu.
- Microsoft.Windows.Design.Extensibility
Ändern Sie im Projektmappen-Explorer den Namen der Codedatei in CustomButton.cs oder CustomButton.vb.
Wenn eine Meldung mit der Frage angezeigt wird, ob Sie eine Umbenennung für alle Verweise in diesem Projekt vornehmen möchten, klicken Sie auf Ja.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen eines benutzerdefinierten DesignModeValueProvider
In diesem Verfahren erstellen Sie einen benutzerdefinierten DesignModeValueProvider. In der TranslatePropertyValue-Methode ändern Sie die Content-Eigenschaft für das Button-Element, damit es im Designer in Großbuchstaben angezeigt wird. Außerdem ändern Sie die Background-Eigenschaft für die Button, damit diese im Designer mit der Standardsystemfarbe angezeigt wird. Diese Änderungen beeinflussen nur den Designer. Zur Laufzeit werden die Background-Eigenschaft und die Content-Eigenschaft mit den vom Benutzer festgelegten Werten angezeigt.
Tipp
In diesem Verfahren erstellen Sie einen DesignModeValueProvider, der zwei verschiedene Eigenschaften behandelt. Sie können auch mehrere DesignModeValueProvider-Objekte erstellen, um verschiedene Eigenschaften zu behandeln.
So erstellen Sie einen benutzerdefinierten DesignModeValueProvider
Fügen Sie dem CustomButton-Projekt eine neue Klasse mit dem Namen CustomButtonDesignModeValueProvider.cs oder CustomButtonDesignModeValueProvider.vb hinzu.
Die neue Klasse wird im Code-Editor geöffnet.
Fügen Sie am Anfang der Datei die folgenden Namespaces hinzu. Ersetzen Sie gegebenenfalls die vorhandenen Namespaces.
Imports System Imports System.Windows 'SystemColors Imports System.Windows.Media 'SolidColorBrush Imports System.Windows.Controls 'Button Imports Microsoft.Windows.Design.Model 'DesignModeValueProvider Imports Microsoft.Windows.Design.Metadata
using System; using System.Windows; //SystemColors using System.Windows.Media; //SolidColorBrush using System.Windows.Controls; //Button using Microsoft.Windows.Design.Model; using Microsoft.Windows.Design.Metadata; //DesignModeValueProvider
Bearbeiten Sie die CustomButtonDesignModeValueProvider-Klasse, sodass sie vom DesignModeValueProvider erbt.
Public Class CustomButtonDesignModeValueProvider Inherits DesignModeValueProvider End Class
class CustomButtonDesignModeValueProvider : DesignModeValueProvider { }
Fügen Sie der Klasse einen Konstruktor hinzu. Im Konstruktor identifizieren Sie die Eigenschaften, die Sie aufzeichnen möchten.
Public Sub New() Properties.Add(GetType(Button), "Content") Properties.Add(GetType(Button), "Background") End Sub
public CustomButtonDesignModeValueProvider() { Properties.Add( typeof(Button), "Content"); Properties.Add(typeof(Button), "Background"); }
Überschreiben Sie die TranslatePropertyValue-Methode in der Klasse. Hier geben Sie das neue Verhalten der Eigenschaften zur Entwurfszeit an.
Public Overrides Function TranslatePropertyValue( _ ByVal item As ModelItem, _ ByVal identifier As PropertyIdentifier, _ ByVal value As Object) As Object If identifier.DeclaringType Is GetType(Button) And _ identifier.Name = "Content" Then Return value.ToString().ToUpper() End If If identifier.DeclaringType Is GetType(Button) And _ identifier.Name = "Background" Then Return New SolidColorBrush(SystemColors.ControlColor) End If Return MyBase.TranslatePropertyValue(item, identifier, value) End Function
public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value) { if (identifier.DeclaringType == typeof( Button ) && identifier.Name == "Content" ) { return ((string)value).ToUpper(); } if (identifier.DeclaringType == typeof(Button) && identifier.Name == "Background") { return new SolidColorBrush(SystemColors.ControlColor); } return base.TranslatePropertyValue(item, identifier, value); }
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen eines benutzerdefinierten Schaltflächensteuerelements
In diesem Verfahren erstellen Sie das benutzerdefinierte Steuerelement. Sie erstellen ein einfaches benutzerdefiniertes Steuerelement, das vom Button erbt, aber keine zusätzliche benutzerdefinierte Funktionalität enthält.
So erstellen Sie ein benutzerdefiniertes Schaltflächensteuerelement
Öffnen Sie die CustomButton-Klasse im Code-Editor.
Fügen Sie am Anfang der Datei die folgenden Namespaces hinzu. Ersetzen Sie gegebenenfalls die vorhandenen Namespaces.
Imports System.Windows.Controls 'Button Imports Microsoft.Windows.Design.Features 'Feature
using System.Windows.Controls; //Button using Microsoft.Windows.Design.Features; //Feature
Ersetzen Sie die vorhandene Klasse durch die folgende Klasse.
Public Class CustomButton Inherits Button Shared Sub New() End Sub End Class
public class CustomButton : Button { static CustomButton() { } }
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Anfügen des DesignModeValueProvider an das benutzerdefinierte Steuerelement
In diesem Verfahren fügen Sie den DesignModeValueProvider mit dem FeatureAttribute-Attribut an das benutzerdefinierte Steuerelement an.
Tipp
Sie können auch einen DesignModeValueProvider an ein benutzerdefiniertes Steuerelement anfügen, indem Sie benutzerdefinierte Entwurfszeitmetadaten bereitstellen. Weitere Informationen finden Sie unter Bereitstellen von Entwurfszeitmetadaten.
So fügen Sie den DesignModeValueProvider an das benutzerdefinierte Steuerelement an
Suchen Sie im Code-Editor die Deklaration für die CustomButton-Klasse. Sie sollte wie folgt aussehen:
Public Class CustomButton Inherits Button
public class CustomButton : Button
Fügen Sie der Klassendeklaration ein Featureattribut hinzu, und geben Sie den DesignModeValueProvider an.
<Feature(GetType(CustomButtonDesignModeValueProvider))> _ Public Class CustomButton Inherits Button
[Feature(typeof(CustomButtonDesignModeValueProvider))] public class CustomButton : Button
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen einer Testanwendung
So erstellen Sie eine Testanwendung
Fügen Sie der Projektmappe ein neues WPF-Anwendungsprojekt mit dem Namen CustomButtonTestApplication hinzu.
Die Datei MainWindow.xaml wird im WPF-Designer geöffnet.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie dann auf Als Startprojekt festlegen.
Klicken Sie im Menü Projekt auf Verweis hinzufügen, und verwenden Sie die Registerkarte Projekte, um einen Verweis auf das CustomButton-Projekt hinzuzufügen.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Testen des benutzerdefinierten Steuerelements
So testen Sie das benutzerdefinierte Steuerelement
Ersetzen Sie in der XAML-Ansicht für MainWindow.xaml den vorhandenen XAML-Code durch den folgenden Code:
<Window x:Class="CustomButtonTestApplication.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:cb="clr-namespace:CustomButton;assembly=CustomButton" Title="MainWindow" Height="300" Width="300"> <Grid> <cb:CustomButton Height="75" Width="100">Button1</cb:CustomButton> </Grid> </Window>
Wählen Sie in der Entwurfsansicht die Schaltfläche aus. Falls notwendig, klicken Sie auf die Informationsleiste oben im Designer, um die Ansicht erneut zu laden.
Suchen Sie im Eigenschaftenfenster die Background-Eigenschaft.
Geben Sie Red ein, und drücken Sie die EINGABETASTE.
Der XAML-Code wird mit dem Code Background="Red" aktualisiert, aber die Farbe der Schaltfläche ändert sich in der Entwurfsansicht nicht.
Suchen Sie im Eigenschaftenfenster die Content-Eigenschaft.
Geben Sie Hello World ein, und drücken Sie die EINGABETASTE.
Der XAML-Code wird mit dem Inhalt Hello World aktualisiert, aber auf der Schaltfläche wird der Text HELLO WORLD in der Entwurfsansicht angezeigt.
Klicken Sie im Menü Debuggen auf Debuggen starten.
Die Anwendung wird gestartet, und das Fenster wird angezeigt. Die Schaltfläche ist rot und enthält zur Laufzeit den Text Hello World.
Schließen Sie das Fenster.
Siehe auch
Aufgaben
Gewusst wie: Ändern des Verhaltens einer Eigenschaft zur Entwurfszeit