2014-12-09 1 views
0

Я создал пользовательский пользовательский элемент управления пользователем. Он должен работать на сенсорном экране, поэтому я должен использовать анимацию вместо заданного свойства на триггере IsClicked. Он отлично работает, но мне также нужно сделать серый градиент рамки, когда свойство UserControl IsEnabled установлено на false.Фон с отключенным управлением в wpf

Это мой код:

<UserControl x:Class="TicketApplication.Controls.RectangleButton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     x:Name="button" 
     Width="255" 
     Height="85" 
     mc:Ignorable="d"> 
<Grid x:Name="grid" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch"> 
    <Border x:Name="border" 
      Width="Auto" 
      Height="Auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      CornerRadius="20"> 
     <Border.Background> 
      <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
       <GradientStop Offset="0.138" Color="{Binding Path=BackgroundGradientTopColor}" /> 
       <GradientStop Offset="0.982" Color="{Binding Path=BackgroundGradientBottomColor}" /> 
      </LinearGradientBrush> 
     </Border.Background> 
     <TextBlock x:Name="text" 
        Width="Auto" 
        Height="Auto" 
        Margin="0" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Center" 
        FontFamily="Open Sans" 
        FontSize="{Binding Path=TextSize, 
             FallbackValue=40}" 
        FontWeight="Bold" 
        Foreground="White" 
        ScrollViewer.VerticalScrollBarVisibility="Disabled" 
        Text="{Binding Path=Text, 
            FallbackValue='Test'}" 
        TextAlignment="Center" 
        TextWrapping="Wrap" /> 
     <Border.Style> 
      <Style TargetType="{x:Type Border}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=IsEnabled}" Value="false"> 
         <Setter Property="Background"> 
          <Setter.Value> 
           <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
            <GradientStop Offset="0.138" Color="#3d4144" /> 
            <GradientStop Offset="0.982" Color="#3d4144" /> 
           </LinearGradientBrush> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Border.Style> 
    </Border> 
    <Grid.Triggers> 
     <EventTrigger RoutedEvent="Grid.MouseDown"> 
      <BeginStoryboard> 
       <Storyboard Completed="Storyboard_Completed"> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"> 
         <EasingColorKeyFrame KeyTime="0:0:0:0.0" Value="#3d4144" /> 
         <EasingColorKeyFrame KeyTime="0:0:0:0.15" Value="{Binding Path=BackgroundGradientTopColor}" /> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"> 
         <EasingColorKeyFrame KeyTime="0:0:0:0.0" Value="#3d4144" /> 
         <EasingColorKeyFrame KeyTime="0:0:0:0.15" Value="{Binding Path=BackgroundGradientBottomColor}" /> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Grid.Triggers> 
</Grid> 

Как вы можете видеть, что я сделал триггер для IsEnabled собственности, но она не работает.

ответ

1

LocalValue имеет более высокий приоритет, чем значение, исходящее от триггеров. Для получения дополнительной информации, пожалуйста, посетите это link. Чтобы решить вашу проблему, вместо того, чтобы напрямую устанавливать фоновый фон по умолчанию, установите его через Style setter. Ниже приведен модифицированный стиль Border.

<Style TargetType="{x:Type Border}"> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush StartPoint="0.5,0" 
            EndPoint="0.5,1"> 
       <GradientStop Offset="0.138" 
           Color="{Binding Path=BackgroundGradientTopColor}" /> 
       <GradientStop Offset="0.982" 
           Color="{Binding Path=BackgroundGradientBottomColor}" /> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsEnabled}" 
         Value="false"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush StartPoint="0.5,0" 
              EndPoint="0.5,1"> 
         <GradientStop Offset="0.138" 
             Color="#3d4144" /> 
         <GradientStop Offset="0.982" 
             Color="#3d4144" /> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Отлично, он работает, спасибо! Вы знаете, как реализовать свойство IsCheckable в таком контроле? Я не знаю, как я могу опустить блок из-за пропуска анимации, предполагая, что у меня есть свойство IsCheckable в коде позади? – Lukas

Смежные вопросы