【问题标题】:Changing the label foreground on mouseover, but the label is inside of button content在鼠标悬停时更改标签前景,但标签位于按钮内容内
【发布时间】:2013-03-08 01:54:21
【问题描述】:

我是 WPF 和 XAML 的新手,但正如我所读到的那样,这仍然是一件棘手的事情。我想在鼠标悬停时更改的是Label 前景色,但标签位于按钮内容内部。一切都应该按样式完成,没有C#。

<Button Name="Home_Button" Height="50" VerticalAlignment="Top" Click="Home_Click" Background="Gray" Foreground="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0">
   <DockPanel>
       <Image Source="Images/icons/home.png" HorizontalAlignment="Left" Margin="-90,0,0,0" />
       <Label VerticalAlignment="Center" HorizontalAlignment="Right"  Margin="0,0,-90,0" Foreground="LightGray" FontSize="12">Home</Label>
   </DockPanel>
</Button>

我的样式设置如下:

<Style TargetType="{x:Type Button}" x:Key="MetroButton">
    <Setter Property="MinHeight" Value="25" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="FontSize" Value="10" />
    <Setter Property="FontFamily" Value="{DynamicResource DefaultFont}" />
    <Setter Property="Background" Value="{DynamicResource GrayBrush7}" />
    <Setter Property="BorderBrush" Value="{DynamicResource TextBoxBorderBrush}" />
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
    <Setter Property="Padding" Value="5,6" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MouseOverBorder">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PressedBorder">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="0.7" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="0.3" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ActiveContent">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ActiveContent">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unfocused" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border x:Name="Background"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}" />
                    <Rectangle x:Name="DisabledVisualElement"
                               Fill="{DynamicResource ControlsDisabledBrush}"
                               IsHitTestVisible="false"
                               Opacity="0"
                               RadiusY="3"
                               RadiusX="3" />
                    <Border x:Name="MouseOverBorder"
                            Background="{DynamicResource GrayBrush8}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Opacity="0" />
                    <Border x:Name="ActiveContent"
                            Background="LightGray"
                            Opacity="0" 
                            />
                    <Border x:Name="PressedBorder"
                            Background="{DynamicResource GrayBrush5}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Opacity="0" />
                    <Rectangle x:Name="FocusRectangle"
                               Stroke="{DynamicResource TextBoxMouseOverInnerBorderBrush}"
                               RadiusY="4"
                               RadiusX="4"
                               Margin="-1"
                               Opacity="0" />
                    <Rectangle x:Name="FocusInnerRectangle"
                               StrokeThickness="{TemplateBinding BorderThickness}"
                               Stroke="{DynamicResource TextBoxMouseOverBorderBrush}"
                               RadiusX="3"
                               RadiusY="3"
                               Opacity="0" />
                    <ContentPresenter x:Name="contentPresenter"
                                      RecognizesAccessKey="True"
                                      ContentTemplate="{TemplateBinding ContentTemplate}"
                                      Content="{TemplateBinding Content, Converter={StaticResource ToUpperConverter}}"
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      Margin="{TemplateBinding Padding}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在我想在Label 上更改MouseOver 上的Foreground.Color Button。现在样式设置只改变ButtonMouseOver上的Background。

【问题讨论】:

    标签: c# wpf xaml button mouseevent


    【解决方案1】:

    在按钮样式的 Style.Resources 中为 Label 放置一个子样式,这是一个精简的示例,但应该解释我要说的内容。

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <Style TargetType="Button">
                <Style.Resources>
                    <Style TargetType="Label">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Foreground" Value="Green"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Style.Resources>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Blue"/>
                    </Trigger>
                </Style.Triggers>
                    <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid Background="Gray">
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
    
                                <!-- This represents your image/-->
                                <Grid Grid.Row="0" Background="{TemplateBinding Background}"/>
                                <Label FontSize="20" Grid.Row="1" Content="{TemplateBinding Content}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
    
        <Grid>
            <Button Margin="172,122,131,79" Foreground="Green">
                test
            </Button>
        </Grid>
    </Window>
    

    Label 样式不适用于按钮之外的任何内容,如果您将鼠标悬停在按钮区域的任何部分上,它会将上半部分变为蓝色,但仅当鼠标悬停在下半部分时才会将文本变为绿色(被标签覆盖)

    【讨论】:

    • 是的,但这会触发标签上的鼠标悬停,而不是按钮。当鼠标悬停在按钮上时,我需要更改标签的前景,或者我错了?因为我做了类似的事情,但没有成功。
    • 两者都会做,当鼠标悬停在按钮的任何部分(包括标签)上时,背景颜色会改变,当鼠标悬停在标签上时,背景会保持变化,现在前景也会发生变化.
    【解决方案2】:

    试试这个。

    <Button Height="36" Margin="286,274,0,0" Width="74" MouseEnter="Button_MouseEnter_1">
           <Label x:Name="mylbl" Content="Test" MouseEnter="mylbl_MouseEnter"/>
    </Button>
    

    后面的代码:

    private void mylbl_MouseEnter(object sender, MouseEventArgs e)
    {
          mylbl.Background = new SolidColorBrush(Colors.Red);
    }
    

    【讨论】:

    • 我想我错过了“没有 C#”的部分。
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2023-03-14
    • 2017-07-28
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多