Как установить свойство Foreground возможного TextBlock в ContentPresenter в Silverlight? - PullRequest
1 голос
/ 03 декабря 2011

У меня есть собственный стиль для кнопок в моем проекте Silverlight, и я хочу установить основной цвет (и другие свойства) текста в кнопке. Но моя идея состоит в том, чтобы использовать ContentPresenter в стиле. Таким образом, я все еще могу положить в кнопку все, что захочу.

Но если есть текст как контент, я хочу иметь возможность устанавливать определенные свойства, такие как Foreground, FontFamily, FontSize и т. Д. Я также хочу изменять эти свойства при наведении и т. Д.

Это мой стиль (упрощенно):

<Style x:Key="ButtonStyle" TargetType="Button">
    <!-- There are other properties here, but I left them out for brevity -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name="ButtonBorder" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Padding="{TemplateBinding Padding}">
                    <ContentPresenter x:Name="ButtonContent" 
                                      Content="{TemplateBinding Content}" 
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                    </ContentPresenter>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <!-- I would like to change the Foreground here -->
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Всю информацию, которую я нахожу, скажите мне добавить TextBlock.Foreground="..." в ContentPresenter, т. Е .:

                    <ContentPresenter x:Name="ButtonContent" 
                                      Content="{TemplateBinding Content}" 
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      TextBlock.Foreground="{TemplateBinding Foreground}">

                    </ContentPresenter>

Однако, это не работает для меня. Я получаю сообщение об ошибке, в котором говорится, что присоединяемое свойство Foreground недоступно для типа TextBlock. Это потому, что это решение будет работать только в WPF, и как я могу установить это свойство в Silverlight?

Я знаю, что могу просто установить передний план с помощью тега <Setter>, но как я могу изменить его при наведении мыши? Я хочу установить передний план ContentPresenter, чтобы в MouseOver VisualState я мог его изменить.

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

(извините за мой плохой английский)

Вы можете просто установить свойства для кнопки, она должна работать:

<Button Style="{StaticResource ButtonStyle}" Content="Test" Foreground="Red" FontFamily="Georgia" FontSize="25"/>

Или вы можете создать стиль для своей текстовой кнопки:

<Style x:Key="ButtonTextStyle" TargetType="Button" BasedOn="{StaticResource ButtonStyle}">
    <Setter Property="Foreground" Value="Red"/>
</Style>

и используйте его:

<Button Style="{StaticResource ButtonTextStyle}" Content="Test"/>

EDIT:

Попытайтесь поместить ContentControl вместо ContentPresenter - так что у вас будет ForegroundProperty и VisualState внутри вашей StoryBoard:

<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ButtonContent">
    <DiscreteObjectKeyFrame KeyTime="0" Value="Red"/>
</ObjectAnimationUsingKeyFrames>
0 голосов
/ 03 декабря 2011

Взгляните на шаблон элемента управления базовой линии, используемый для кнопки @ http://msdn.microsoft.com/en-us/library/cc278069(v=vs.95).aspx,. Я бы порекомендовал вам взять этот элемент управления, а затем навести курсор мыши в соответствии с вашими требованиями. Поэтому, чтобы вы навели курсор мыши на красный, я бы сделал что-то вроде следующего

 <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity" To="1"/>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" To="Red"/>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" To="Red"/>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" To="Red"/>
                                    </Storyboard>
                                </VisualState>
...