我们使用的是第三方编辑控件(TxTextControl),它具有各种工具栏和其他可以附加到它的控件。这是通过将工具栏放在视图中的某个位置并按名称进行关联来完成的。看起来是这样的:
<tx:RulerBar x:Name="rulerBar"/>
<tx:TextControl RulerBar="rulerBar"/>当在XAML中定义时,这是很好的,但是我们有一个场景,我们需要按过程构建这个场景。由于某种原因,当我们尝试关联RulerBar (或任何其他工具栏/控件)时,它会抛出一个无法定位工具栏的错误。例如:
DockPanel dock = new DockPanel();
dock.Children.Add(new RulerBar { Name="rulerBar" });
dock.Children.Add(new TextControl { RulerBar = "rulerBar" });我还尝试添加已加载的事件处理程序,并将RulerBar关联推迟到两个控件完全加载之后,但我仍然得到相同的错误。这是简单的工作,还是有什么诡计,我错过了?不幸的是,名称关联是它们提供的唯一机制,我们不能通过引用将控件关联起来。
发布于 2016-06-02 16:49:32
@艾亚尔·佩里对这个问题的诊断是正确的。为了使它工作,您应该使用FrameworkElement.RegisterName方法。下面是一个如何使用它的示例:
DockPanel dock = new DockPanel();
var ruler = new RulerBar { Name = "rulerBar" };
dock.RegisterName(ruler.Name, ruler);
dock.Children.Add(ruler);
dock.Children.Add(new TextControl { RulerBar = "rulerBar" });发布于 2016-06-02 16:41:27
在WPF中,XAML解析过程将元素的x:Name属性的值与其名称关联起来,从而启用按名称进行查找。
那么,为什么在XAML中分配Name属性是有效的呢?这是因为Name属性被标记为一个属性,该属性指示解析器像对待x:Name属性一样对待它。
由于您没有实现与xaml解析器相同的逻辑,所以您必须做一些额外的编码才能使代码工作。我自己也不知道怎么做,但幸运的是@Grx70 70做到了。看看他的答案。
https://stackoverflow.com/questions/37597205
复制相似问题