Exemplarische Vorgehensweise: Ändern des Verhaltens einer Eigenschaft zur Entwurfszeit
Aktualisiert: November 2007
Wenn Sie den Windows Presentation Foundation (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.
Wichtiger Hinweis: |
---|
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
Hinweis: |
---|
Je nach den aktiven Einstellungen bzw. der Version unterscheiden sich die Dialogfelder und Menübefehle auf dem Bildschirm unter Umständen von den in der Hilfe beschriebenen. Klicken Sie zum Ändern der Einstellungen im Menü Extras auf Einstellungen importieren und exportieren. Weitere Informationen finden Sie unter Visual Studio-Einstellungen. |
Vorbereitungsmaßnahmen
Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:
- Visual Studio 2008
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.
Erweitern Sie im Projektmappen-Explorer den Ordner Designs, und öffnen Sie die Datei Generic.xaml.
Generic.xaml wird im WPF-Designer geöffnet.
Ersetzen Sie in der XAML-Ansicht alle Vorkommen von "CustomControl1" in der Datei Generic.xaml durch "CustomButton".
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 das Button-Element, damit es 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.
Hinweis: |
---|
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
using System; using System.Windows; //SystemColors using System.Windows.Media; //SolidColorBrush using System.Windows.Controls; //Button using Microsoft.Windows.Design.Model; //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(Button.ContentProperty) Properties.Add(Button.BackgroundProperty) End Sub
public CustomButtonDesignModeValueProvider() { Properties.Add(Button.ContentProperty); Properties.Add(Button.BackgroundProperty); }
Überschreiben Sie die TranslatePropertyValue-Methode in der Klasse. Hier geben Sie das neue Verhalten der Eigenschaften zur Entwurfszeit an.
Public Overrides Function TranslatePropertyValue(ByVal identifier As PropertyIdentifier, ByVal value As Object) As Object If identifier.DependencyProperty Is Button.ContentProperty Then Return value.ToString().ToUpper() End If If identifier.DependencyProperty Is Button.BackgroundProperty Then Return New SolidColorBrush(SystemColors.ControlColor) End If Return MyBase.TranslatePropertyValue(identifier, value) End Function
public override object TranslatePropertyValue(PropertyIdentifier identifier, object value) { if (identifier.DependencyProperty == Button.ContentProperty) { return ((string)value).ToUpper(); } if (identifier.DependencyProperty == Button.BackgroundProperty) { return new SolidColorBrush(SystemColors.ControlColor); } return base.TranslatePropertyValue(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.
Hinweis: |
---|
Sie können auch einen DesignModeValueProvider mit dem Metadatenspeicher an ein benutzerdefiniertes Steuerelement anfügen. Weitere Informationen finden Sie unter Metadatenspeicher und unter Gewusst wie: Verwenden des Metadatenspeichers. |
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.
In WPF-Designer wird die Datei Window1.xaml 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 Window1.xaml den vorhandenen XAML-Code durch den folgenden Code:
<Window x:Class="CustomButtonTestApplication.Window1" 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="Window1" 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