TiltEffect на TextBlock - PullRequest
       3

TiltEffect на TextBlock

4 голосов
/ 17 февраля 2012

Я использую TiltEffect , предоставленный Microsoft. Я пытаюсь использовать его с TextBlocks , однако он не работает, даже если я добавлю тип TextBlock в список элементов Tiltable:

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

Однако, если я окружу TextBlock Border и переместу событие Tap к границе, оно будет работать правильно.

Есть ли какая-либо конкретная причина для такого поведения? Не слишком элегантно окружать все мои накладные текстовые блоки рамками.

ОБНОВЛЕНИЕ: То же самое относится к форме прямоугольника.

ОБНОВЛЕНИЕ 2: мое текущее решение - это обходной путь, я определил пользовательский элемент управления:

<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 и т. Д., Его необходимо реализовать таким же образом.

Однако я не удовлетворен этим решением, поэтому все еще ищу более элегантный обходной путь.

ОБНОВЛЕНИЕ 3: описанный выше подход не идеален, я обнаружил, что он недетерминированно завершается с исключением «неверный параметр» (иногда он выдается после запуска приложения, иногда нет).

Ответы [ 3 ]

6 голосов
/ 17 февраля 2012

Меня не порадовал эффект наклона набора инструментов Silverlight, особенно то, как он «магически» применяется к элементам, основанным на типе.Поэтому я написал альтернативу.Вы также можете настроить, сколько «наклона» вы хотите применить.Исходный код можно найти здесь:

Metro in Motion Part # 4: Эффект наклона

Затем можно индивидуально применить плитку к элементам следующим образом:

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

Где целое число указывает, какой наклон применить.Я бы порекомендовал использовать довольно низкие значения, нативный эффект довольно тонкий, однако люди, как правило, делают его слишком экстремальным в своих собственных приложениях silerlight, эффекты Metro должны быть тонкими, они не должны кричать на вас!

5 голосов
/ 27 августа 2013

В случае, если кто-то еще сталкивается с этим, у меня есть другое решение.

Просто заключите элемент TextBlock в теги ListBoxItem.

, например

<ListBoxItem>
   <TextBlock>
       A Tilting Textblock
   </TextBlock>
</ListBoxItem>
0 голосов
/ 12 сентября 2013

Если вы хотите использовать TiltEfect, это, вероятно, означает, что вы используете его в качестве кнопки, поэтому вам просто нужно использовать кнопку или HyperlinkButton, которые вы изменяете, чтобы отображать только текст. Таким образом, вы сможете воспользоваться дополнительными свойствами кнопки, такими как 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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...