为什么禁用按钮会删除其背景颜色?

时间:2011-12-22 08:50:29

标签: c# wpf windows-phone-7

我有一个按钮,其背景由LinearGradientBrush指定。我需要禁用此按钮。所以,我只是将其isEnabled属性设置为"false"。但是,这也删除了背景,因为我的按钮没有边框,我剩下的只是按钮上的文字。这是我的按钮的xaml代码:

<Button x:Name="create" Content="Create a new one?" Margin="12, 0, 12, 0" ClickMode="Release" Click="create_click" MinWidth="330" MinHeight="50" BorderThickness="0" Height="110" Foreground="Black">
    <Button.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
             <GradientStop Color="#FFFA2FC5" Offset="0.279" />
             <GradientStop Color="#FF5904A0" Offset="1" />
        </LinearGradientBrush>
    </Button.Background>
</Button>

当我再次将isEnabled设置为"true"时,背景又回来了,一切都再好了。

这是应该发生的吗?
如果我只是想让按钮暂时不起作用而不改变它的外观,我该怎么办?

3 个答案:

答案 0 :(得分:3)

您需要编辑相应的VisualState以更改禁用按钮的外观。最简单的方法是使用Expression Blend。

打开表单,右键单击按钮,然后选择编辑模板 - &lt;编辑副本。这将在页面资源部分放置一大块XAML,它定义控件的VisualStates,以及将实例的样式绑定到新定义的样式。 Xaml看起来像这样......

 <Style x:Key="ButtonStyle1" TargetType="Button">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
    <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/>
    <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/>
    <Setter Property="Padding" Value="10,3,10,5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid 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="ContentContainer">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneBackgroundBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneForegroundBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ButtonBackground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneForegroundBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ButtonBackground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="0" Margin="{StaticResource PhoneTouchTargetOverhang}">
                        <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您关心的是名为“已禁用”的VisualState元素。已经定义了“透明”的背景,因此您只需编辑它。

如果您是手动执行此操作,则需要在按钮上设置Style="{StaticResource ButtonStyle1}"才能生效。

答案 1 :(得分:1)

更简单的方法是定义一个在IsEnabled上有触发器的样式,它将设置你想要的背景。

  <Button >
    <Button.Style>
           <Style   TargetType="{x:Type Button}" >
             <Setter Property="Background" Value=" the Enabled color i want"/>
                   <Style.Triggers>
                         <Trigger Property="IsEnabled" Value="True">
                           <Setter Property="Background" Value=" the Disabled color i want"/>
                         </Trigger>
                    </Style.Triggers>
            </Style>
      </Button.Style>
    </Button>

如果您打算多次使用它,请在资源中定义您的样式。

答案 2 :(得分:0)

在WPF / Silverlight中,Button控件的Style过度定义。因此,每当您尝试更改某些内容(例如Background)时,已定义的某些Triggers将覆盖自定义样式。比如你经历过的方式。

要解决此问题,您需要为按钮创建自己的ControlTemplate,您可以在其中明确定义Background,并且永远不会添加Trigger以在禁用时对其进行更改