>我需要在具有命中测试功能的 WPF 中绘制一些图表。按照文档中的说明,我将几何图形绘制为 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 属性。 我尝试为它定义绑定,但它说:
不能在类型的"可视化集合"属性上设置"绑定" '...我的视觉主机...'。"绑定"只能在 依赖对象的依赖属性
首先,您需要在容器上添加一些公共属性...
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}"/>