TextBlock上的TiltEffect

时间:2012-02-17 10:08:49

标签: c# windows-phone-7

我正在使用Microsoft提供的 TiltEffect util。我试图将它与 TextBlocks 一起使用,但是,即使我将TextBlock类型添加到Tiltable项目列表中它也不起作用:

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

但是,如果我使用边框包围TextBlock,并将Tap事件移动到边框,则它可以正常工作。

这种行为有什么具体原因吗?使用Borders包围我所有可点击的TextBlock并不是太优雅。

更新:这同样适用于矩形形状。

UPDATE2:我当前的解决方案是一种解决方法,我定义了一个自定义控件:

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

在后面的代码中:

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 ) ) ) );
}

我目前不使用任何其他特定于TextBlock的属性,只使用Text,因此如果需要TextWrapping,FontSize等,则必须以相同的方式实现。

但是我对这个解决方案不满意,所以仍然在寻找更优雅的解决方法。

UPDATE3:上面的方法并不完美,我发现它不确定地崩溃了“参数不正确”异常(有时它在我启动应用程序后抛出,有时不会抛出)。

3 个答案:

答案 0 :(得分:6)

我对Silverlight工具包倾斜效果不满意,尤其是“基于类型”对元素进行“合理”应用的方式。所以我写了一个替代方案。您还可以配置要应用的“倾斜度”。源代码可以在这里找到:

Metro in Motion Part #4: Tilt Effect

然后,您可以按如下方式单独将tile应用于元素:

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

其中整数指定要应用的倾斜度。我建议使用相当低的值,原生效果非常微妙,但是人们倾向于在自己的silerlight应用程序中使它太极端,Metro效果应该是微妙的,它们不应该对你大喊大叫!

答案 1 :(得分:5)

如果遇到其他人,我有另一个解决方案。

只需用TextBoxItem标签包含TextBlock元素。

e.g。

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

答案 2 :(得分:0)

如果你想要TiltEfect可能意味着你将它用作按钮,那么你应该只使用一个按钮或超链接按钮来重新显示文本。像这样,您将能够利用按钮的额外属性,如Command。 以下是超链接按钮样式的示例:

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

你可以使用:

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