您可以使用 VisualStateManager 定义 VisualStates。要在 Border 上获得您想要的行为,以下应该是一个很好的起点:
xml:
<Border Name="TheBorder" BorderThickness="5"
Margin="30" Padding="20"
wpfApplication1:StateManager.VisualState="{Binding ElementName=TheBorder,
Path=IsEnabled, Mode=TwoWay,
Converter={StaticResource EnabledToVisualStateConverter}}">
<Border.Background>
<SolidColorBrush x:Name="BackgroundBrush" Color="Transparent"/>
</Border.Background>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="Common">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Flash">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BackgroundBrush"
Storyboard.TargetProperty="Color" To="Red"
RepeatBehavior="Forever"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
转换器:
public class EnabledToVisualStateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var isEnabled = (bool) value;
if (isEnabled)
return "Flash";
return "Normal";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
用于更改 VisualState 的 StateManager 类:
public class StateManager
{
private static string _valueToApplyOnInitialization;
public static readonly DependencyProperty VisualStateProperty =
DependencyProperty.RegisterAttached("VisualState", typeof (string), typeof (StateManager),
new PropertyMetadata(VisualStateChangeCallback));
public static string GetVisualState(DependencyObject obj)
{
return (string)obj.GetValue(VisualStateProperty);
}
public static void SetVisualState(DependencyObject obj, string value)
{
obj.SetValue(VisualStateProperty, value);
}
public static void VisualStateChangeCallback(object sender, DependencyPropertyChangedEventArgs args)
{
var element = sender as FrameworkElement;
if (element == null)
return;
if (!element.IsInitialized)
{
_valueToApplyOnInitialization = (String) args.NewValue;
element.Initialized += OnElementInitialized;
}
else
VisualStateManager.GoToElementState(element, (string)args.NewValue, true);
}
private static void OnElementInitialized(object sender, EventArgs e)
{
var element = sender as FrameworkElement;
if (element == null)
return;
VisualStateManager.GoToElementState(element, _valueToApplyOnInitialization, true);
element.Initialized -= OnElementInitialized;
}
}
如果您想使用 ViewModel 中的属性而不是 Border 上的 IsEnabled 属性,则只需将 Binding to 'TheBorder' 替换为 ViewModel 属性。