【问题标题】:background color change in stackpanelstackpanel中的背景颜色变化
【发布时间】:2026-02-13 03:25:05
【问题描述】:

我在按钮单击时的超链接按钮中有堆栈面板,我必须更改堆栈面板背景

              <HyperlinkButton Name="WhereToStayButton" Margin="0,0,0,0"  Grid.Row="5"  Click="WhereToStayButton_Click">
            <HyperlinkButton.Template>

                <ControlTemplate TargetType="HyperlinkButton">
                    <StackPanel Orientation="Horizontal"   Background="#EBEBEB"     x:Name="sp1">
                        <Image Source="/Assets/Menu/wheretostay.png"   Stretch="None"/>
                        <TextBlock Text="{Binding Path=LocalizedResources.menu_where_stay, Source={StaticResource LocalizedStrings}}" VerticalAlignment="Center" Margin="5,10" FontSize="26" Foreground="Black" FontFamily="{StaticResource CustomLucidaGrandStyle}"/>
                    </StackPanel>
                </ControlTemplate>
            </HyperlinkButton.Template>
        </HyperlinkButton>

【问题讨论】:

    标签: wpf windows-phone-7


    【解决方案1】:

    试试这个

    使用这个命名空间using System.Windows.Media; 并在按钮点击事件中写下这个

    private void WhereToStayButton_Click(object sender, RoutedEventArgs e)
    {
       stackpanelname.Background = new SolidColorBrush(Colors.Red);
    }
    

    【讨论】:

    • 无法在后端获取堆栈面板名称,因为它存在于模板中
    • 查看这个答案如何在模板*.com/questions/19379946/…中访问控制
    • 为我工作:)
    【解决方案2】:

    您可以通过在 Click 事件触发器上应用 Storyboard 来做到这一点

    <ControlTemplate TargetType="HyperlinkButton">
       <StackPanel Orientation="Horizontal"  Background="#EBEBEB" x:Name="sp1">
          <Image Source="/Assets/Menu/wheretostay.png"  Stretch="None"/>
          <TextBlock />
       </StackPanel>
       <ControlTemplate.Triggers>
         <EventTrigger RoutedEvent="ButtonBase.Click">
            <BeginStoryboard>
              <Storyboard>
                <ColorAnimation To="Green" Storyboard.TargetName="sp1" 
                                Storyboard.TargetProperty="Background.Color"/>
              </Storyboard>
            </BeginStoryboard>
         </EventTrigger>
       </ControlTemplate.Triggers>
     </ControlTemplate>
    

    对于 Windows Phone 7,请使用 Visual State

    <ControlTemplate TargetType="HyperlinkButton">
       <ControlTemplate.Resources>
         <SolidColorBrush x:Key="PhoneBackgrounBrush" Color="Green"/>
       </ControlTemplate.Resources>
       <StackPanel Orientation="Horizontal" x:Name="sp1">
          <VisualStateManager.VisualStateGroups>
             <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal"/>
                <VisualState x:Name="MouseOver"/>
                <VisualState x:Name="Pressed">
                   <Storyboard>
                     <ObjectAnimationUsingKeyFrames
                             Storyboard.TargetProperty="Background"
                             Storyboard.TargetName="sp1">
                        <DiscreteObjectKeyFrame KeyTime="0"
                                Value="{StaticResource PhoneBackgrounBrush}"/>
                     </ObjectAnimationUsingKeyFrames>
                   </Storyboard>
                </VisualState>
             </VisualStateGroup>
           </VisualStateManager.VisualStateGroups>
           <Image Source="/Assets/Menu/wheretostay.png" Stretch="None"/>
           <TextBlock />
       </StackPanel>
     </ControlTemplate>
    

    【讨论】:

    • 这是 windows phone 8 错误是:在 “可附加属性 Triggers 无法识别或无法访问”请帮助我
    • 您可以在 Windows Phone 7 中使用VisualStates,如here 所述。创建 Pressed Visual 状态。
    • 我已经更新了 Windows Phone 7 的答案。看看吧。
    • 很好,我必须在按钮点击完成后更改为原始背景颜色。
    • 如果您想恢复到原始值。只需为NormalMouseOver 添加另外两个视觉状态。我已经更新了答案。
    【解决方案3】:

    正如 Rohit 所说,利用视觉状态来实现您的要求..,

    <ControlTemplate TargetType="HyperlinkButton">
        <StackPanel Orientation="Horizontal"  Background="#EBEBEB" x:Name="sp1">
              <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal"/>
                    <VisualState x:Name="MouseOver"/>
                    <VisualState x:Name="Pressed">
                         <Storyboard>
                                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="sp1">
                            <EasingColorKeyFrame KeyTime="0" Value="#FFE91818"/>
                                        </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Disabled"/>
                </VisualStateGroup>
             </VisualStateManager.VisualStateGroups>
           <Image Source="/Assets/Menu/wheretostay.png"  Stretch="None"/>
           <TextBlock />
       </StackPanel>
    </ControlTemplate>
    

    【讨论】: