如何在不破坏控件模板的情况下绑定属性?

如何在不破坏控件模板的情况下绑定属性?

问题描述:

我做了一个控制模板,它是目标类型,如果按钮。 拖动它的事件触发器属于IsEnable和IsnotEnable属性。当控制模板启用时,我将不透明度设置为100%,当不透明度降低到40%时。如何在不破坏控件模板的情况下绑定属性?

在我的GUI窗口

我这样定义一个新的按钮:

<Button x:Name="JoinB" 
     IsEnabled="{Binding Path=GroupStatus,Converter={StaticResource EnableConverter}}" 
     Template="{DynamicResource JoinButtonStyle}" /> 

EnableConverter是一个简单的转换器,返回true或false。 转换器正在工作。我的按钮没有启用,但不透明度不会改变。 如果我定义我的按钮,像这样(没有转换器):

<Button x:Name="JoinB" IsEnabled="false" 
     Template="{DynamicResource JoinButtonStyle}" /> 

透明度确实发生了改变。

你知道我在做什么错吗?

JoinButtonStyle代码:

<ControlTemplate x:Key="JoinButtonStyle" TargetType="{x:Type Button}"> 
    <ControlTemplate.Resources> 
     <Storyboard x:Key="OnMouseEnter1"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="rectangle"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="8"/> 
      </DoubleAnimationUsingKeyFrames> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.Color)" Storyboard.TargetName="rectangle"> 
       <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF00BC02"/> 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="OnMouseLeave1"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" Storyboard.TargetName="rectangle"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="2"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="OnPreviewMouseLeftButtonDown1"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="rectangle"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.7"/> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="label"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.7"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="OnPreviewMouseLeftButtonUp1"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="rectangle"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="label"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="onNotEnabled"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0.4"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="onEnabled"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </ControlTemplate.Resources> 
    <Grid x:Name="grid" VerticalAlignment="Center" HorizontalAlignment="Center" Background="#00000000"> 
     <Rectangle x:Name="rectangle" HorizontalAlignment="center" VerticalAlignment="center" Height="30" Width="90" RadiusX="15" RadiusY="15" StrokeThickness="1" Stroke="#FF58A6FD"> 
      <Rectangle.Effect> 
       <DropShadowEffect BlurRadius="2" ShadowDepth="0" Color="#FF58A6FD"/> 
      </Rectangle.Effect> 
     </Rectangle> 
     <Label x:Name="label" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="#FF58A6FD" Content="Join"/> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp"> 
      <BeginStoryboard x:Name="OnPreviewMouseLeftButtonUp1_BeginStoryboard" Storyboard="{StaticResource OnPreviewMouseLeftButtonUp1}"/> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonDown"> 
      <BeginStoryboard x:Name="OnPreviewMouseLeftButtonDown1_BeginStoryboard" Storyboard="{StaticResource OnPreviewMouseLeftButtonDown1}"/> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Mouse.MouseLeave"> 
      <BeginStoryboard x:Name="OnMouseLeave1_BeginStoryboard" Storyboard="{StaticResource OnMouseLeave1}"/> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
      <BeginStoryboard x:Name="OnMouseEnter1_BeginStoryboard" Storyboard="{StaticResource OnMouseEnter1}"/> 
     </EventTrigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Trigger.EnterActions> 
       <BeginStoryboard x:Name="OnMouseEnter1_BeginStoryboard1" Storyboard="{StaticResource onNotEnabled}"/> 
      </Trigger.EnterActions> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard x:Name="onEnabled_BeginStoryboard" Storyboard="{StaticResource onEnabled}"/> 
      </Trigger.EnterActions> 
     </Trigger> 
    </ControlTemplate.Triggers> 

</ControlTemplate> 

转换器代码:

public class EnableToGroupStatusConverter:IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((ClientManager.DateGroupInfo.GroupStatusType)value == ClientManager.DateGroupInfo.GroupStatusType.CLOSED) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

}

+0

你能提供你的模板代码? – Grx70 2014-11-22 12:01:12

+0

我写了一个转换器和一个控件模板,并发现不透明度已正确更新。请发布'JoinButtonStyle'的代码以及'EnableConverter'; – kennyzx 2014-11-22 12:07:29

+0

将我的代码添加到主要问题 – 2014-11-22 13:07:42

不是有两个不同Trigger的启用/禁用状态,你现在做的

<Trigger Property="IsEnabled" Value="False"> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource onNotEnabled}"/> 
    </Trigger.EnterActions> 
</Trigger> 
<Trigger Property="IsEnabled" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource onEnabled}"/> 
    </Trigger.EnterActions> 
</Trigger> 

将它们组合成一个TriggerEnterActions/ExitActions

<Trigger Property="IsEnabled" Value="False"> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource onNotEnabled}"/> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource onEnabled}"/> 
    </Trigger.ExitActions> 
</Trigger> 
+0

返回true或false谢谢!它的工作现在。有什么不同? – 2014-11-22 23:28:07