Почему отключение кнопки удаляет ее фоновый цвет? - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть кнопка, фон которой обозначен 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 ]

3 голосов
/ 22 декабря 2011

Вам нужно отредактировать соответствующий VisualState, чтобы изменить внешний вид отключенной кнопки. Самый простой способ сделать это - использовать Expression Blend.

Открыв форму, щелкните правой кнопкой мыши на кнопке и выберите «Изменить шаблон» - «Редактировать копию». Это поместит кусок 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 с именем «Disabled». Уже задан фон «Прозрачный», поэтому вам просто нужно отредактировать его.

Если вы делаете это вручную, вам нужно установить Style="{StaticResource ButtonStyle1}" на кнопку, чтобы это вступило в силу.

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

гораздо более простой способ - определить стиль с триггером на 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>

или определить свой стиль в ресурсах, если вы планируете использовать его несколько раз.

0 голосов
/ 22 декабря 2011

В WPF / Silverlight элемент управления Button имеет слишком большое значение Style.Поэтому всякий раз, когда вы пытаетесь что-то изменить, например, Background, определенные Triggers, которые уже были определены, будут переопределять пользовательский стиль.Например, как вы это испытали.

Чтобы преодолеть это, вам нужно создать собственную кнопку ControlTemplate для кнопки, внутри которой вы можете явно определить ее Background иникогда не добавляйте Trigger, чтобы изменить его, когда он отключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...