首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DesignMode的行为(DesignTime)

DesignMode的行为(DesignTime)
EN

Stack Overflow用户
提问于 2017-06-28 22:23:38
回答 1查看 288关注 0票数 0

我有一个CustomBehavior,它在运行时工作得很好。现在我也想在DesignMode上有一些“行为”。但是我的OnAttached()不是在DesignMode (https://www.codeproject.com/Tips/1040701/How-to-Debug-the-Design-Time-Errors-in-WPF-XAML-Fi)调用的。

代码语言:javascript
复制
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;
        }
    }
}

DesignMode上如何调用我的_DesignMethod()有什么窍门吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-29 15:03:52

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

要使其正常工作,您需要在xaml代码中传递附加的对象/元素。不幸的是,LogicalTreeHelperVisualTreeHelper找不到我的对象/元素。

抽象行为

代码语言:javascript
复制
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用法

代码语言:javascript
复制
<Grid x:Name="myGrid">
    <I:Interaction.Behaviors>
        <MyBehaviors:InheritedBehavior DesignerValue="1" DesignerElement="{Binding ElementName=myGrid}"/>
    </I:Interaction.Behaviors>
</Grid>

预览

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44805284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档