DesignMode(DesignTime)中的行为

时间:2017-06-28 14:23:38

标签: c# wpf behavior designmode

我有一个CustomBehavior,它在运行时运行良好。现在我也希望有一些"行为"在DesignMode。但我的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;
        }
    }
}

是否有诀窍,如何在_DesignMethod()致电我的DesignMode

1 个答案:

答案 0 :(得分:0)

这是我目前的解决方案。但它并不完美,如果你可以省略DesignerElement property,那就太好了。

要使其正常工作,您需要将xaml代码传递给附加的对象/元素。很遗憾,LogicalTreeHelperVisualTreeHelper无法找到我的对象/元素。

抽象行为

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用法

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

预览

preview