我正在使用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:上面的方法并不完美,我发现它不确定地崩溃了“参数不正确”异常(有时它在我启动应用程序后抛出,有时不会抛出)。
答案 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"/>