首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在附加属性中初始化装饰器

如何在附加属性中初始化装饰器
EN

Stack Overflow用户
提问于 2011-03-17 03:44:19
回答 1查看 3K关注 0票数 1

我想在附加属性中为Adorner创建FrameworkElement。但是在PropertyChangedCallback AdornerLayer中,my的元素是null

我怎样才能解决这个问题?

目前我这样做:

代码语言:javascript
复制
    private static void _OnIsModalAdornerAttachedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as FrameworkElement;

        bool oldValue = (bool)e.OldValue;
        bool newValue = (bool)e.NewValue;

        if (null != element && oldValue != newValue)
        {
            var descriptor = DependencyPropertyDescriptor.FromProperty(VisibilityProperty, typeof(FrameworkElement));

            if (newValue)
            {
                descriptor.AddValueChanged(element, element_VisibilityChanged);
            }
            else
            {
                descriptor.RemoveValueChanged(element, element_VisibilityChanged);
            }
    }


private static void element_VisibilityChanged(object sender, EventArgs e)
        {
            var element = sender as FrameworkElement;

            if (null != element)
            {
                var adornerLayer = AdornerLayer.GetAdornerLayer(element);

                if (null != adornerLayer)
                {
                    // check if adorner exists
                    bool isExists = false;
                    var adorners = adornerLayer.GetAdorners(element);
                    if (null != adorners)
                    {
                        foreach (var adorner in adorners)
                        {
                            if (adorner is ModalAdorner)
                            {
                                isExists = true;
                                break;
                            }
                        }
                    }

                    // add if is not presented
                    if (!isExists)
                    {
                        var modalAdorner = new ModalAdorner(element);
                        adornerLayer.Add(modalAdorner);

                        var visibilityBinding = new Binding { Path = new PropertyPath("Visibility"), Source = element };
                        modalAdorner.SetBinding(VisibilityProperty, visibilityBinding);
                    }
                }
            }
        }

然后,我手动将FrameworkElementFrameworkElement属性更改为Hidden,然后将其更改为Visible。但这种方式并不是真的。

更新

我解决了这个问题。现在我这样做:

代码语言:javascript
复制
private static void _OnIsModalAdornerAttachedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as FrameworkElement;

        bool oldValue = (bool)e.OldValue;
        bool newValue = (bool)e.NewValue;

        if (null != element && oldValue != newValue)
        {
            if (newValue)
            {
                if (element.IsLoaded)
                {
                    _AttachAdorner(element);
                }
                else
                {
                    element.Loaded += (sender, args) =>
                    {
                        _AttachAdorner(element);
                    };
                }
            }
            else
            {
                // remove adorner
                var adornerLayer = AdornerLayer.GetAdornerLayer(element);

                if (null != adornerLayer)
                {
                    var adorners = adornerLayer.GetAdorners(element);

                    if (null != adorners)
                    {
                        foreach (var adorner in adorners)
                        {
                            if (adorner is ModalAdorner)
                            {
                                adornerLayer.Remove(adorner);
                            }
                        }
                    }
                }
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-11 03:02:03

答案是update:使用加载事件。

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

https://stackoverflow.com/questions/5334642

复制
相关文章

相似问题

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