我有一个按钮,其背景由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"
时,背景又回来了,一切都再好了。
这是应该发生的吗?
如果我只是想让按钮暂时不起作用而不改变它的外观,我该怎么办?
答案 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
以在禁用时对其进行更改