2009-09-29 9 views
14

Ich erstelle ein einfaches benutzerdefiniertes Steuerelement, das von der Toggle-Schaltfläche ausgeht und es dem Benutzer ermöglicht, überprüfte und ungeprüfte Inhalte direkt in XAML anzugeben. Es funktioniert gut, aber es basiert auf einem Auslöser, und ich weiß nicht, wie man den Auslöser außer in einem Stil definiert. Wenn ich den Stil definiere, dann verliere ich alles außerhalb des benutzerdefinierten Steuerelements.Wie fügt man einem benutzerdefinierten WPF-Steuerelement einen Trigger hinzu, ohne den vorhandenen Stil zu überschreiben?

Was ich gerne in der Lage wäre zu tun, ist nur diesen Trigger an jede vorhandene Stilset an anderer Stelle auf dem Steuerelement anhängen.

Hier ist der XAML für den Stil/Trigger.

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

Ich habe versucht, den Stil über die BasedOn mit einem Standardtyp erben, aber es wird nicht funktionieren, wenn die benutzerdefinierte Steuerung einen expliziten Stil durch seine Eltern festgelegt hat. Ich habe auch EventTriggers in Betracht gezogen, aber ich glaube nicht, dass es ein Event geben würde, um die Kontrolle zu initialisieren.

Danke für jede Hilfe, die jemand anbieten kann. :)

Antwort

17

Nur um Dinge über die Terminologie hier zu klären: A Benutzersteuerung ist ein Steuerelement, das von der UserControl-Klasse abgeleitet ist. Wenn ich Sie richtig verstanden habe, haben Sie von ToggleButton abgeleitet, um die Eigenschaften UncheckedContent und CheckedContent hinzuzufügen. In diesem Fall haben Sie ein benutzerdefiniertes Steuerelement erstellt. Es ist immer einfacher zu folgen, wenn wir einer gemeinsamen Terminologie zustimmen :)

Soweit ich weiß, können Sie solch eine generische Stilvererbung in XAML nicht machen. Sie müssen immer explizit angeben, auf welchen Stil ein anderer Stil basiert. Ihr Stil kann entweder auf dem Standardstil für ToggleButton oder auf einem bestimmten anderen Stil basieren. Wenn Sie keine Stilvererbungskette erstellen können, die dies berücksichtigt, funktioniert diese Methode nicht.

Aber da Sie ein benutzerdefiniertes Steuerelement haben, konnten Sie nicht einen Standardstil dafür schreiben, der auf dem Standard-Umschaltflächenstil wie diesem basiert?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

Dann, wenn Sie einen expliziten Stil auf einen Umschaltknopf gelten würden Sie angeben, dass es auf dem Standard-Toggle-Button Stil basiert.

Sie könnten auch eine (Standard) Steuerungsvorlage für Ihre neue Umschaltfläche in Designs \ Generic.xaml schreiben, die die obigen Trigger enthält. In der Überblendung können Sie eine Kopie der Standardvorlage für den Umschaltknopf ("Vorlage bearbeiten" -> "Kopie bearbeiten") erhalten, so dass Sie sicherstellen können, dass Ihre Umschalttaste genauso aussieht wie die normale Umschalttaste. Dann fügen Sie die Trigger oben in diese Vorlage ein.

BTW: Sie müssen kein neues Steuerelement erstellen, nur um neue Eigenschaften hinzuzufügen. Sie können einem vorhandenen Steuerelement unter Verwendung von attached properties neue Eigenschaften hinzufügen. Sie können von XAML wie normale Eigenschaften verwendet werden.

+0

Danke für die Eingabe, es war sehr hilfreich. Ich ging einen etwas anderen Weg und erweiterte den bestehenden Stil im Code, um meinen Trigger hinzuzufügen, ohne den bestehenden zu ruinieren. Der BasedOn-Vorschlag, den Sie gemacht haben, hatte ich bereits ausprobiert und funktioniert nicht, wenn ein expliziter Stil festgelegt wurde. Ich bin aber von deinen Ideen gekommen, also schreibe ich es als Antwort. Die angefügte Eigenschaften Idee war wirklich gut und ich habe diese Änderung auch gemacht, danke. :) –

+1

Würde es Ihnen etwas ausmachen, ein paar Details zu veröffentlichen, was Sie getan haben? Ich würde gerne dasselbe machen. – stone

+0

Das hat mir gerade viel Code gespart. Vielen Dank! – MattS423

Verwandte Themen