2012-04-09 6 views
2

Ich bin ein professioneller Windows-Anwendungsentwickler in VB.NET und C# mit Windows Forms, und jetzt sehr aufgeregt, in WPF-Entwicklung zu treten. Hier ist meine erste Frage, die ich nicht durch Such lösen könnte:Inhalt Ausrichtung und Positionierung in Vorlagen WPF-Steuerelement

Ich schrieb die folgende Vorlage, um vollständig das Aussehen meiner Tasten zu ändern:

<ControlTemplate TargetType="{x:Type Button}" x:Key="ImageButtonTemplate"> 
     <Grid> 
      <Image Name="img" Source="/PSPlayer;component/Images/Buttons/ButtonNormal_normal.png"/> 
      <ContentPresenter Stylus.IsTapFeedbackEnabled="False" Stylus.IsTouchFeedbackEnabled="False" Stylus.IsPressAndHoldEnabled="False" Stylus.IsFlicksEnabled="False" Width="98" Height="61"/> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter TargetName="img" Property="Source" Value="/PSPlayer;component/Images/Buttons/ButtonNormal_MouseOver.png"/> 
      </Trigger> 
      <Trigger Property="IsPressed" Value="True"> 
       <Setter TargetName="img" Property="Source" Value="/PSPlayer;component/Images/Buttons/ButtonNormal_MouseDown.png"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

und hier eine Schaltfläche Definition:

 <Button Content="SomeText" Height="61" Margin="0,0,0,7" Name="button7" Width="98" Click="button7_Click" Template="{StaticResource ImageButtonTemplate}"/> 

Das Problem ist, dass der Text "SomeText" oben links auf der Schaltfläche erscheint und ich diesen Ort nicht ändern kann. Die Eigenschaften 'HorizontalContentAlignment' und 'VerticalContentAlignment' der Schaltflächen zeigen keinen Effekt (ich frage mich warum).

Zusätzlich möchte ich den Text manchmal an einer bestimmten Stelle positionieren, wie x = 70, wenn das Hintergrundbild ein Symbol enthält, das auf der linken Seite liegt, bis x = 60.

Ich machte einen Rundgang mit einem Etikett in der Taste eingebettet, die ich positionieren könnte, aber denke, es muss eine sauberere Lösung sein.

Ich hoffe, ich machte mich klar. WPF rulez durch die Art und Weise - wie auch diese Seite, die meisten meiner Probleme gelöst ich mit Buchungen von hier (aus Richtung google) :)

Vielen Dank im Voraus,

Julian

Antwort

6

Ein paar Dinge sind passiert hier. Ihr erstes Problem ist, dass Sie eine absolute Größe für Ihren ContentPresenter festlegen (im Allgemeinen vermeiden Sie in WPF absolute Größen und absolute Positionen für Steuerelemente, aber es ist eine harte Gewohnheit, wenn Sie aus WinForms kommen). Wenn Sie das entfernen, kann es richtig ausgerichtet werden, indem Sie VerticalAlignment und HorizontalAlignment des ContentPresenter selbst festlegen. Der Grund, warum das Festlegen der VerticalAlignment und der HorizontalAlignment auf der Schaltfläche nicht funktioniert, liegt daran, dass Sie diese Eigenschaften nirgendwo in Ihrer Vorlage verwenden. Idealerweise würde man so etwas tun:

<ContentPresenter VerticalAlignment="{TemplateBinding VerticalAlignment}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"/> 

Und jetzt können Sie die Ausrichtung auf die Schaltfläche festlegen, die diese Vorlage verwendet wird. Wenn Sie möchten, dass diese Vorlage immer zentriert ist, können Sie sie einfach fest codieren, anstatt die TemplateBinding-Funktion zu verwenden.

Im Allgemeinen ist beim Ersetzen von Vorlagen zu beachten, dass jede Eigenschaft des Steuerelements, die Sie nicht explizit in Ihrer Vorlage binden, von WPF ignoriert wird, wenn das Steuerelement gerendert wird. Wenn Sie ihm nicht sagen, was mit diesen Eigenschaften zu tun ist, wird es nicht raten. Eine seltene Ausnahme ist die content -Eigenschaft in Ihrem Beispiel, die Sie nicht ausdrücklich binden können, da WPF davon ausgeht, dass Sie beabsichtigen, sie in den ContentPresenter zu übernehmen! Aber alle anderen Schaltflächeneigenschaften werden ignoriert. Wenn Sie beispielsweise versuchen, die Hintergrundeigenschaft Ihrer Schaltflächenvorlage zu ändern, wird sie ignoriert, da WPF nicht weiß, wo der Hintergrund platziert werden soll. Sollte es die ganze Kontrolle sein? Sollte es dein Gitter sein? Nur dein ContentPresenter? Du musst es sagen.

+0

Danke, das hat geholfen. Ich änderte es in: VerticalAlignment = "{TemplateBinding VertikalContentAlignment}" HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}" dann war es gut. – Julian

+0

Scheint ich brauche etwas Ruf, um Ihre Antwort zu wählen. – Julian

+1

@Julian: NP. Ich habe deine Frage gewählt, um dir ein wenig zu helfen! –