C# 如何为FrameworkElement VisualCollection创建绑定
我需要在WPF中绘制一些具有命中测试功能的图表。按照中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现一个主机容器,如下所示(为了简洁起见,跳过命中测试代码):C# 如何为FrameworkElement VisualCollection创建绑定,c#,wpf,graphics,drawing,C#,Wpf,Graphics,Drawing,我需要在WPF中绘制一些具有命中测试功能的图表。按照中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现一个主机容器,如下所示(为了简洁起见,跳过命中测试代码): 公共类MyVisualHost:FrameworkElement { 公共视觉集合儿童; 公共MyVisualHost() { 儿童=新的视觉集合(本); } 受保护的重写int VisualChildrenCount { 获取{return children.Count;} } 受保护的重写Visual GetVi
公共类MyVisualHost:FrameworkElement
{
公共视觉集合儿童;
公共MyVisualHost()
{
儿童=新的视觉集合(本);
}
受保护的重写int VisualChildrenCount
{
获取{return children.Count;}
}
受保护的重写Visual GetVisualChild(int索引)
{
如果(索引<0 | |索引>=子项计数)
抛出新ArgumentOutOfRangeException();
返回子项[索引];
}
}
在xaml中使用它,就像这样
<local:MyVisualHost/>
用户可以缩放和滚动图表,DrawingVisuals会在单独的线程中更新,而不会阻塞UI
如何为子属性定义绑定,以便在运行时修改它(更新其中包含的DrawingVisuals)
更新
我刚刚注意到,当您在xaml编辑器中选择xaml元素时,属性面板中列出了VisualCollection属性。
我尝试为它定义绑定,但它说:
无法在类型为的“VisualCollection”属性上设置“Binding”
“…MyVisualHost…”。只能在服务器上设置“绑定”
DependencyObject的DependencyProperty
首先,您需要在容器上设置一些公共属性
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); }
}
}
公共类MyVisualHost:FrameworkElement
{
公共视觉集合儿童;
公共MyVisualHost()
{
儿童=新的视觉集合(本);
添加(新按钮(){Name=“Button”});
添加(newtextbox(){Name=“TextBox”});
}
受保护的重写int VisualChildrenCount
{
获取{return children.Count;}
}
受保护的重写Visual GetVisualChild(int索引)
{
如果(索引<0 | |索引>=子项计数)
抛出新ArgumentOutOfRangeException();
返回子项[索引];
}
公共整数计数=>VisualChildrenCount;
公共视觉此[整数索引]
{
获取{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}"/>
最后绑定到这样的属性
<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}"/>