Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何知道项目何时变为命中测试可见=错误_Silverlight_Silverlight 3.0 - Fatal编程技术网

Silverlight 如何知道项目何时变为命中测试可见=错误

Silverlight 如何知道项目何时变为命中测试可见=错误,silverlight,silverlight-3.0,Silverlight,Silverlight 3.0,这是一个简化的例子 我有一个画布和一个usercontrol在里面 我将画布设置为ishitestvisible=false 如何判断usercontrol不再可见?最好能得到一个变更通知 我尝试将数据绑定到用户控件上的IsHitTestVisible,但当我更改画布上的值时,它不会更改 我在不透明度和可见性方面也有同样的问题……您确实有一个事件IshitteTvisibleChanged,当IshitteTvisible属性更改时会引发该事件。我认为数据绑定也不应该有问题,因为IshitteV

这是一个简化的例子

我有一个画布和一个usercontrol在里面

我将画布设置为ishitestvisible=false

如何判断usercontrol不再可见?最好能得到一个变更通知

我尝试将数据绑定到用户控件上的IsHitTestVisible,但当我更改画布上的值时,它不会更改


我在不透明度和可见性方面也有同样的问题……

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


如果您能够准确地发布绑定方式,这将非常有用。

所以您的问题是画布中有一个UserControl。用户控件需要知道画布何时将IshitteVisible设置为false

IshittesVisible不是一个在树上“固有”的属性。如果在对象上设置IshitteVisible=false,则该对象的子对象上的该属性不会更改

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

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

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);
如果在“Canvas”上显示更改,则将触发PropertyChanged事件

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

    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;
            }
        }
    }
private List notifiers=new List();
已加载void MyUserControl_(对象发送方,RoutedEventArgs e)
{
foreach(通知程序中的var通知程序)
{
notifier.PropertyChanged-=pn_PropertyChanged;
notifier.StopMonitoring();
}
Clear();
foreach(GetAllParents中的var parent(this))
{
PropertyNotifier pn=新的PropertyNotifier();
pn.监视器(“IshittetVisible”,父级);
pn.PropertyChanged+=新事件处理程序(pn_PropertyChanged);
通知程序。添加(pn);
}
}
静态IEnumerable GetAllParents(FrameworkElement元素)
{
FrameworkElement父元素=元素。父元素作为FrameworkElement;
如果(父项!=null)
{
收益母公司;
foreach(GetAllParents中的变量el(父))
{
收益率;
}
}
}

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

您是说当父对象也发生更改时,子对象上的IshittesVisible绑定应该发生更改吗?画布将发生IshittesVisible更改。用户控件需要知道它是否可见。我想关键在于,控件如何知道其父控件已更改了IsitTestVisibleChanged,而不引用父控件?控件不再是hittestvisible,但如何知道发生了什么?好吧,UserControl可以通过parent属性获取对其父控件的引用。那有用吗?然后,可以在代码中设置到IshittesVisible属性的绑定,以便获得更改通知。尽管如果父级的父级获取IshitteVisible false(以此类推),这将不起作用。这是你需要处理的情况吗?或者您只关心直接的父级吗?例如,它是父级,但是在实际情况中,父级是多个级别,每个usercontrol的级别数可能不同,我需要触发一个事件以了解更改发生的时间。确定。因此,是否要确定直接或间接作为用户控件父级的任何元素是否已更改IsitTestVisible属性*删除了我“猜测”IshitteVisible可继承的注释。我猜错了。我遇到的问题是,在现实世界中,用户控件没有简单的方法获取对画布的任何引用。用户控件是画布的直接子级吗?或者,您试图做的是确定树上的任何父级何时更改此属性?最终,你想做什么?为什么UserControl需要知道其父控件是否更改了此属性?用户控件不是画布的直接子控件。在实际情况中,用户控件位于我编写的窗口控件内。当窗口控件最小化时,它将获得ISHITTESVISIBLE并更改不透明度。此外,用户控件可以位于窗口内的选项卡控件内,因此我还需要知道用户控件是否位于活动选项卡上。这样做的目的是,当用户控件不太容易执行您想要执行的操作时,用户控件将不会执行任何处理。尝试以下操作:在UserControl.Loaded中,通过跟踪父指针树查找所有父指针。在每个父级上,设置到IshittesVisible属性的数据绑定,以便收到更改通知。还有一件事要处理;如果任何父项发生变化(例如,移动到其他面板)。在这种情况下,我认为加载的事件应该再次触发,因此您需要更新正在监视的绑定。我更新了我的答案,加入了一些示例代码,展示了我的尝试。