2012-02-17 6 views
4

J'utilise le TiltEffect utilisé fourni par Microsoft. Je suis en train de l'utiliser avec TextBlocks, cependant, il ne fonctionne pas, même si j'ajouter le type de TextBlock à la liste des articles Inclinable:TiltEffect sur TextBlock

TiltEffect.TiltableItems.Add(typeof(System.Windows.Controls.TextBlock)); 

Cependant, si j'Entourez le TextBlock avec un Border et déplacez l'événement Tap vers la bordure, cela fonctionne correctement.

Y at-il une raison spécifique à ce comportement? Ce n'est pas trop élégant d'entourer tous mes TextBlocks tappables avec des frontières.

MISE À JOUR: La même chose s'applique à la forme Rectangle.

MAJ2: Ma solution actuelle est une solution de contournement, je défini un contrôle personnalisé:

<UserControl x:Class="MyApp.Controls.TiltableTextBlock" 
    Name="tiltableTextBlock" 
    ...> 
    <Button Margin="0" Padding="0"> 
     <Button.Template> 
      <ControlTemplate> 
       <TextBlock Margin="0" Padding="0" 
        Text="{Binding Text, ElementName=tiltableTextBlock}" 
        Style="{Binding Style, ElementName=tiltableTextBlock}" /> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
</UserControl> 

Et dans le code derrière:

public partial class TiltableTextBlock : UserControl 
{ 
    public TiltableTextBlock() 
    { 
     InitializeComponent(); 
    } 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(TiltableTextBlock), new PropertyMetadata(String.Empty)); 

    //NOTE: hiding the Style property of the base class, so the Style does not get applied to the UserControl, rather to the TextBlock. 
    public new Style Style 
    { 
     get { return (Style)GetValue(StyleProperty); } 
     set { SetValue(StyleProperty, value); } 
    } 

    public new static readonly DependencyProperty StyleProperty = 
     DependencyProperty.Register("Style", typeof(Style), typeof(TiltableTextBlock), new PropertyMetadata(new Style(typeof(TextBlock)))); 
} 

Je n'utilisez plus aucune autre propriété spécifique TextBlock , juste Text, donc si TextWrapping, FontSize, etc est nécessaire, il doit être implémenté de la même manière.

Cependant, je ne suis pas satisfait de cette solution, donc toujours à la recherche d'une solution de contournement plus élégante. UPDATE3: L'approche ci-dessus n'est pas parfaite, j'ai découvert qu'il se bloque de façon non déterministe avec un "paramètre est incorrect" Exception (parfois il est lancé après le démarrage de l'application, parfois non).

+0

Je pense que cela est lié à ma question que je viens de publier. Avez-vous essayé de rendre votre arrière-plan transparent? http://stackoverflow.com/questions/14664251/why-cant-i-tap-click-blank-areas-inside-of-a-border-contentcontrol-without-sett – kamranicus

Répondre

6

Je n'étais pas satisfait de l'effet d'inclinaison du toolkit Silverlight, en particulier de la façon dont il est appliqué de façon «magique» aux éléments basés sur le type. J'ai donc écrit une alternative. Vous pouvez également configurer la quantité d'inclinaison que vous souhaitez appliquer. Le code source se trouve ici:

Metro in Motion Part #4: Tilt Effect

Vous pouvez ensuite appliquer individuellement la tuile aux éléments comme suit:

<TextBlock local:MetroInMotion.Tilt="6"/> 

Lorsque le nombre entier indique la quantité d'inclinaison à appliquer. Je recommande d'utiliser des valeurs assez basses, l'effet natif est assez subtil, mais les gens ont tendance à le rendre beaucoup trop extrême dans leurs propres applications de silerlight, les effets Metro doivent être subtils, ils ne devraient pas crier sur vous!

+0

Très joliment codé, j'ai appris en lisant la base de code, j'ai vu dans votre profil que vous êtes lié au marché boursier, envoyez-moi un courriel à benji (at) tipranks (point) com si vous voulez une copie gratuite de notre (maintenant deux fois de suite) Finovate gagnant logiciel comme un petit signe de ma gratitude. Merci encore. –

5

Dans le cas où quelqu'un d'autre rencontre cela, j'ai une autre solution.

Entourez simplement l'élément TextBlock avec les balises ListBoxItem.

par exemple.

<ListBoxItem> 
    <TextBlock> 
     A Tilting Textblock 
    </TextBlock> 
</ListBoxItem> 
0

Si vous voulez TiltEfect que cela signifie probablement que vous utilisez comme un bouton de sorte que vous devez simplement utiliser un bouton ou HyperlinkButton que vous restylé pour afficher le texte juste. Comme ceci, vous pourrez profiter des propriétés supplémentaires du bouton comme Command. Voici un exemple de bouton Hyperlink Style:

<Style x:Key="NoUnderlineHyperlinkButtonStyle" TargetType="HyperlinkButton"> 
     <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}"/> 
     <Setter Property="HorizontalAlignment" Value="Left"/> 
     <Setter Property="VerticalAlignment" Value="Top"/> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="HyperlinkButton"> 
        <Border Background="Transparent"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="MouseOver"/> 
           <VisualState x:Name="Pressed"> 
            <!--<Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="TextElement"> 
              <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneAccentBrush}"/> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard>--> 
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="TextElement"> 
              <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Border Background="{TemplateBinding Background}" Margin="{StaticResource PhoneHorizontalMargin}" Padding="{TemplateBinding Padding}"> 
          <TextBlock x:Name="TextElement" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Text="{TemplateBinding Content}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

que vous pouvez utiliser:

<HyperlinkButton Style="{StaticResource NoUnderlineHyperlinkButtonStyle}" Content="My Text" Tap="UIElement_OnTap"/>