这是一个简化的例子。
我有一个画布和一个用户控件。
我将画布设置为IsHitTestVisible = false
如何判断用户控件不再是hittestvisible?最好收到一条通知,说明它已经改变了。
我尝试在用户控件上进行数据绑定到IsHitTestVisible,但是当我更改画布上的值时它不会改变。
我对不透明度和可见度也有同样的问题....
答案 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;
}
}
}
我不知道这是否适用于所有情况,因此您需要对其进行测试。也可能有一种更简单的方法,但这是我能想到的最好方法。