用于更新事件样式触发器的附加属性

本文关键字:属性 触发器 更新 事件 样式 用于 | 更新日期: 2023-09-27 18:34:53

我正在尝试使用附加属性在触发事件时触发UIElement上的样式更改。

以下是案例场景:

用户看到一个TextBox,然后聚焦然后取消聚焦。在附加属性中的某个位置,它会注意到此LostFocus事件并设置一个属性(某处HadFocus

然后,文本框上的样式知道它应该根据此 HadFocus 属性以不同的方式设置自己的样式。

这是我想象的标记的样子...

<TextBox Behaviors:UIElementBehaviors.ObserveFocus="True">
<TextBox.Style>
    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Behaviors:UIElementBehaviors.HadFocus" Value="True">
                <Setter Property="Background" Value="Pink"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</TextBox.Style>

我已经尝试了附加属性的一些组合来使其正常工作,我的最新尝试抛出了一个XamlParseException,指出"触发器上的属性不能为空"。

    public class UIElementBehaviors
{
    public static readonly DependencyProperty ObserveFocusProperty =
        DependencyProperty.RegisterAttached("ObserveFocus",
                                            typeof (bool),
                                            typeof (UIElementBehaviors),
                                            new UIPropertyMetadata(false, OnObserveFocusChanged));
    public static bool GetObserveFocus(DependencyObject obj)
    {
        return (bool) obj.GetValue(ObserveFocusProperty);
    }
    public static void SetObserveFocus(DependencyObject obj, bool value)
    {
        obj.SetValue(ObserveFocusProperty, value);
    }
    private static void OnObserveFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as UIElement;
        if (element == null) return;
        element.LostFocus += OnElementLostFocus;
    }
    static void OnElementLostFocus(object sender, RoutedEventArgs e)
    {
        var element = sender as UIElement;
        if (element == null) return;
        SetHadFocus(sender as DependencyObject, true);
        element.LostFocus -= OnElementLostFocus;
    }
    private static readonly DependencyPropertyKey HadFocusPropertyKey =
        DependencyProperty.RegisterAttachedReadOnly("HadFocusKey",
                                                    typeof(bool),
                                                    typeof(UIElementBehaviors),
                                                    new FrameworkPropertyMetadata(false));
    public static readonly DependencyProperty HadFocusProperty = HadFocusPropertyKey.DependencyProperty;
    public static bool GetHadFocus(DependencyObject obj)
    {
        return (bool)obj.GetValue(HadFocusProperty);
    }
    private static void SetHadFocus(DependencyObject obj, bool value)
    {
        obj.SetValue(HadFocusPropertyKey, value);
    }
}

有人能指导我吗?

用于更新事件样式触发器的附加属性

注册只读依赖项属性并不意味着将Key添加到属性名称中。只需更换

DependencyProperty.RegisterAttachedReadOnly("HadFocusKey", ...);

DependencyProperty.RegisterAttachedReadOnly("HadFocus", ...);

因为HadFocus是属性的名称。