我需要在WPF中绘制一些具有点击测试功能的图表。按照the docs中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现了这样的宿主容器(为简洁起见,跳过了点击测试代码):
public class MyVisualHost : FrameworkElement
{
public VisualCollection children;
public MyVisualHost()
{
children = new VisualCollection(this);
}
protected override int VisualChildrenCount
{
get { return children.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= children.Count)
throw new ArgumentOutOfRangeException();
return children[index];
}
}
像这样在xaml中使用它
<local:MyVisualHost/>
用户可以缩放和滚动图表,并且DrawingVisuals在单独的线程中得到更新,而不会阻塞UI。
如何为children
属性定义绑定,以便可以在运行时更改它(更新其中包含的DrawingVisuals)?
更新 我刚刚注意到,当您在xaml编辑器中选择xaml元素时,“属性”面板中列出了VisualCollection属性。 我尝试为它定义绑定,但是它说:
不能在类型的“ VisualCollection”属性上设置“ Binding” '... MyVisualHost ...'。只能在 DependencyObject的DependencyProperty
答案 0 :(得分:-2)
首先,您将在容器上需要一些公共属性...
public class MyVisualHost : FrameworkElement
{
public VisualCollection children;
public MyVisualHost()
{
children = new VisualCollection(this);
children.Add(new Button() {Name = "button"});
children.Add(new TextBox() {Name = "textbox"});
}
protected override int VisualChildrenCount
{
get { return children.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= children.Count)
throw new ArgumentOutOfRangeException();
return children[index];
}
public int Count => VisualChildrenCount;
public Visual this[int index]
{
get { return GetVisualChild(index); }
}
}
接下来像这样在XAML中定义它...
<Window.Resources>
<local:MyVisualHost x:Key="MyVisualHost"/>
</Window.Resources>
最后绑定到这样的属性...
<TextBox Text="{Binding Path=Count, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>
<TextBox Text="{Binding Path=[0].Name, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>