简体   繁体   English

DesignMode(DesignTime)上的行为

[英]Behavior at DesignMode (DesignTime)

I have a CustomBehavior which is working perfect at runtime. 我有一个CustomBehavior ,可以在运行时完美运行。 Now I also want to have some "behavior" at the DesignMode . 现在,我还想在DesignMode上具有一些“行为”。 But my OnAttached() is not called at DesignMode ( https://www.codeproject.com/Tips/1040701/How-to-Debug-the-Design-Time-Errors-in-WPF-XAML-Fi ). 但是我的OnAttached()没有在DesignModehttps://www.codeproject.com/Tips/1040701/How-to-Debug-the-Design-Time-Errors-in-WPF-XAML-Fi )中调用。

public class CustomBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            _TargetProperty = AssociatedObject.GetType().GetProperty(TargetPropertyName);
            _DesignMethod();
        }
        else
        {
            AssociatedObject.Unloaded += AssociatedObject_Unloaded;
            AssociatedObject.Loaded += AssociatedObject_Loaded;
        }
    }
}

Is there a trick, how to call my _DesignMethod() at DesignMode ? 有一个技巧,如何在DesignMode调用我的_DesignMethod()

This is currently my solution. 这是目前我的解决方案。 But it is not perfect and it would be nice if you could omit the DesignerElement property . 但这不是完美的,如果您可以省略DesignerElement property ,那就太好了。

To get this working, you need to pass in your xaml code the attached object/element. 为了使此工作正常进行,您需要在xaml代码中传递附加的对象/元素。 Unfortunately LogicalTreeHelper or VisualTreeHelper cannot find my object/element. 不幸的是LogicalTreeHelperVisualTreeHelper找不到我的对象/元素。

Abstract Behavior 抽象行为

public abstract class DesignerBaseBehavior : Behavior<FrameworkElement>
{

    // ##############################################################################################################################
    // Dependency Properties
    // ##############################################################################################################################

    #region Dependency Properties

    /// <summary>
    /// The Associated object.
    /// </summary>
    public FrameworkElement DesignerElement
    {
        get { return (FrameworkElement)GetValue(DesignerElementProperty); }
        set { SetValue(DesignerElementProperty, value); }
    }

    /// <summary>
    /// The <see cref="DesignerElement"/> DependencyProperty.
    /// </summary>
    public static readonly DependencyProperty DesignerElementProperty = DependencyProperty.Register("DesignerElement", typeof(FrameworkElement), typeof(DesignerBaseBehavior), new PropertyMetadata(null, _ApplyDesignerElement));

    /// <summary>
    /// Value during the design time
    /// </summary>
    public object DesignerValue
    {
        get { return GetValue(DesignerValueProperty); }
        set { SetValue(DesignerValueProperty, value); }
    }

    /// <summary>
    /// The <see cref="DesignerValue"/> DependencyProperty.
    /// </summary>
    public static readonly DependencyProperty DesignerValueProperty = DependencyProperty.Register("DesignerValue", typeof(object), typeof(DesignerBaseBehavior), new PropertyMetadata(null, _ApplyDesignerElement));


    private static void _ApplyDesignerElement(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        DesignerBaseBehavior designerBaseBehavior = dependencyObject as DesignerBaseBehavior;
        designerBaseBehavior?._ApplyDesignerElement();
    }

    #endregion


    // ##############################################################################################################################
    // Private Properties
    // ##############################################################################################################################

    #region Private Properties

    internal FrameworkElement _AssociatedObject;

    #endregion


    // ##############################################################################################################################
    // Overrides
    // ##############################################################################################################################

    #region Overrides

    /// <summary>
    /// Wird aufgerufen, wenn die Behavior angehängt wird.
    /// </summary>
    protected override void OnAttached()
    {
        if (HtDesignerProperties.IsInDesignMode)
        {
            _ApplyDesignerElement();
        }
        else
        {
            _AssociatedObject = AssociatedObject;
        }
    }

    #endregion

    // ##############################################################################################################################
    // Methods
    // ##############################################################################################################################

    #region Methods

    private void _ApplyDesignerElement()
    {
        if (DesignerElement == null) return;
        if(!HtDesignerProperties.IsInDesignMode) return;

        _AssociatedObject = DesignerElement;
        DesignTime();
    }

    /// <summary>
    /// Is called, when the _AssociatedObject is set.
    /// </summary>
    public abstract void DesignTime();

    #endregion

}

XAML Usage XAML用法

<Grid x:Name="myGrid">
    <I:Interaction.Behaviors>
        <MyBehaviors:InheritedBehavior DesignerValue="1" DesignerElement="{Binding ElementName=myGrid}"/>
    </I:Interaction.Behaviors>
</Grid>

Preview 预习

预习

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM