2017-03-21 2 views
1

Ich habe eine Viewbox:Inhalt eines Button Style erscheint nur in einer Button-Instanz

<Viewbox x:Key="SampleViewbox" > 
    <Grid> 
    <Ellipse Stroke="#e2e2e0" StrokeThickness="6" Fill="#d5273e" Width="128" Height="128"/> 
    </Grid> 
</Viewbox> 

Ich schließe diese dann in einem Stil wie:

<Style x:Key="SampleStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="Transparent" > 
        <ContentPresenter Content="{StaticResource SampleViewbox}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Jetzt habe ich viele Knöpfe mit SampleStyle

<Grid> 
    <StackPanel> 
     <Button Style="{StaticResource SampleStyle}" Height="50" Width="50"></Button> 
     <Button Style="{StaticResource SampleStyle}" Height="80" Width="80"></Button> 
     <Button Style="{StaticResource SampleStyle}" Height="20" Width="20"></Button> 
    </StackPanel> 
</Grid> 

jedoch Nur ein Taste hat die Ellipse (Viewbox)

Wie kann ich alle Knöpfe haben/zeige die Ellipse ??

Antwort

3

Viewbox ist FrameworkElement, das nicht zu mehreren Eltern gehören kann. Jedes Mal, wenn Schaltflächen eine Ressource {StaticResource SampleViewbox} anfordern, erhalten sie dieselbe Instanz.

dieses Verhalten zu ändern, hinzufügen x:Shared="False" Attribut

<Viewbox x:Key="SampleViewbox" x:Shared="False"> 
+0

Vielen es hat funktioniert haben. Ich hatte das in Kaxaml ausprobiert, aber es gab einige Fehler. Habe es jetzt in Visual Studio versucht und es hat gut funktioniert. Gibt es irgendwelche Nachteile der x: Shared = "False" -Flagge? – Sabz

+0

@Sabz, Nachteile? Standard ist 'x: Shared =" True "', in den meisten Situationen möchte man nicht mehrere Kopien von Objekten erstellen (z. B. Pinselressourcen, Konverter). aber hier ist der umgekehrte Fall, es ist das gewünschte Verhalten – ASh

1

Einstellen der x:Shared Attribut des ViewBox-false wie @ASh vorgeschlagen wird in der Tat arbeiten, aber warum Sie beinhalten nicht nur die ViewBox im ControlTemplate wie diese ?

<Style x:Key="SampleStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="Transparent" > 
        <Viewbox> 
         <Grid> 
          <Ellipse Stroke="#e2e2e0" StrokeThickness="6" Fill="#d5273e" Width="128" Height="128"/> 
         </Grid> 
        </Viewbox> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Eine Vorlage ist eine Vorlage und eine Kontrollinstanz ist eine Instanz.

+0

Der Einfachheit halber habe ich nur eine Ellipse geschrieben. Im tatsächlichen Fall enthält die Viewbox andere komplexe Zeichnungen. Ich möchte diese Viewbox auch in anderen Stilen verwenden. – Sabz

+0

Ich sehe, fair genug :) – mm8

2

Ich denke, ein guter Ansatz ist, DataTemplate zu verwenden. So, Sie

<DataTemplate x:Key="SampleViewbox"> 
    <Viewbox> 
     <Grid> 
      <Ellipse 
        Width="128" 
        Height="128" 
        Fill="#d5273e" 
        Stroke="#e2e2e0" 
        StrokeThickness="6" /> 
     </Grid> 
    </Viewbox> 
</DataTemplate> 

Und für Stil

<Style x:Key="SampleStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="Transparent"> 
        <ContentPresenter ContentTemplate="{StaticResource SampleViewbox}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Perfekt. Ich wünschte, ich könnte dies ALSO als Antwort markieren. – Sabz