如何知道项目何时变为命中测试visible = false

时间:2009-09-17 15:38:03

标签: silverlight silverlight-3.0

这是一个简化的例子。

我有一个画布和一个用户控件。

我将画布设置为IsHitTestVisible = false

如何判断用户控件不再是hittestvisible?最好收到一条通知,说明它已经改变了。

我尝试在用户控件上进行数据绑定到IsHitTestVisible,但是当我更改画布上的值时它不会改变。

我对不透明度和可见度也有同样的问题....

2 个答案:

答案 0 :(得分:0)

您确实有一个事件IsHitTestVisibleChanged,它是在IsHitTestVisible属性更改时引发的。我不认为数据绑定也应该存在问题,因为IsHitTestVisible是依赖属性,它将生成更改通知。

如果您能准确发布绑定方式,那将会很有帮助。

答案 1 :(得分:0)

所以你的问题是你在Canvas中有一个UserControl。您的UserControl需要知道Canvas何时将IsHitTestVisible设置为false。

IsHitTestVisible不是在树下“继承”的属性。如果在对象上设置IsHitTestVisible = false,则该属性不会对其进行更改。

因此,一种方法是您可以在UserControl上创建一个属性,例如“IsParentHitTestVisible”,并将UserControl上的该属性绑定到Canvas的IsHitTestVisible属性。然后在UserControl中,您可以处理属性的更改通知。

这是我尝试过的解决方案。 首先,我创建了一个帮助程序类,以便更容易获取属性的更改通知:

public class PropertyNotifier : UserControl
{
    public static readonly DependencyProperty ThePropertyProperty =
        DependencyProperty.Register("TheProperty", typeof(object), typeof(PropertyNotifier), new PropertyMetadata(OnPropertyChanged));

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        PropertyNotifier obj = (PropertyNotifier)d;
        if (obj.PropertyChanged != null)
        {
            obj.PropertyChanged(obj, null);
        }
    }

    public event EventHandler PropertyChanged;

    public void Monitor(string prop, Object instance)
    {
        Binding binding = new Binding();
        binding.Source = instance;
        binding.Path = new PropertyPath(prop);
        SetBinding(ThePropertyProperty, binding);
    }

    public void StopMonitoring()
    {
        SetValue(ThePropertyProperty, null);
    }
}

这只是让您监视对象上的属性并在其发生更改时获取事件。所以你可以这样做:

PropertyNotifier pn = new PropertyNotifier();
pn.Monitor("IsHitTestVisible", theCanvas);
pn.PropertyChanged += new EventHandler(pn_PropertyChanged);

如果IsHitTestVisible在“theCanvas”上发生变化,将触发PropertyChanged事件。

因此,我在UserControl中设置了Loaded事件,如下所示:

    private List<PropertyNotifier> notifiers = new List<PropertyNotifier>();
    void MyUserControl_Loaded(object sender, RoutedEventArgs e)
    {
        foreach (var notifier in notifiers)
        {
            notifier.PropertyChanged -= pn_PropertyChanged;
            notifier.StopMonitoring();
        }
        notifiers.Clear();

        foreach (var parent in GetAllParents(this))
        {
            PropertyNotifier pn = new PropertyNotifier();
            pn.Monitor("IsHitTestVisible", parent);
            pn.PropertyChanged += new EventHandler(pn_PropertyChanged);
            notifiers.Add(pn);
        }
    }

    static IEnumerable<FrameworkElement> GetAllParents(FrameworkElement element)
    {
        FrameworkElement parent = element.Parent as FrameworkElement;
        if (parent != null)
        {
            yield return parent;
            foreach(var el in GetAllParents(parent))
            {
                yield return el;
            }
        }
    }

我不知道这是否适用于所有情况,因此您需要对其进行测试。也可能有一种更简单的方法,但这是我能想到的最好方法。