2017-03-21 1 views
1

J'ai Viewbox:Contenu d'un style de bouton apparaît uniquement dans un cas Bouton

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

J'INCLUDE, alors cela dans un style comme:

<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> 

Maintenant, je créé de nombreux boutons avec 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> 

Cependant, un seul bouton a l'Ellipse (viewbox)

Comment puis-je faire tous les boutons ont/montrent l'ellipse ?? Viewbox est FrameworkElement qui ne peut pas appartenir à plusieurs parents.

Répondre

3

Chaque fois que les boutons demandent une ressource {StaticResource SampleViewbox} ils obtiennent la même instance.

pour modifier ce comportement ajouter x:Shared="False" attribut

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

Merci cela a fonctionné. J'avais essayé ça dans Kaxaml mais ça a jeté quelques erreurs. Je l'ai essayé maintenant dans Visual Studio et cela a bien fonctionné. Y at-il des inconvénients du drapeau x: Shared = "False"? – Sabz

+0

@Sabz, les inconvénients? La valeur par défaut est 'x: Shared =" True "', dans la plupart des cas, on ne veut pas créer plusieurs copies d'objets (par exemple, des ressources de pinceau, des convertisseurs). mais voici le cas contraire, c'est le comportement souhaité – ASh

1

Réglage de l'attribut x:Shared du ViewBox-false comme suggéré par @ASh va bien fonctionner, mais pourquoi ne vous incluez tout simplement pas le ViewBox dans le ControlTemplate comme celui-ci ?

<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> 

Un modèle est un modèle et une instance de contrôle est une instance.

+0

Pour des raisons de simplicité, j'ai écrit une seule ellipse. Dans le cas actuel, la Viewbox contient d'autres dessins complexes. je veux utiliser cette viewbox dans d'autres styles aussi .. – Sabz

+0

Je vois, assez juste :) – mm8

2

Je pense qu'une bonne approche consiste à utiliser DataTemplate. Vous aurez

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

Et pour le style

<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

Parfait. Je voudrais pouvoir marquer cela aussi comme la réponse. – Sabz