我正在开发一个WPF-Surface项目,并且已经为一个ByteTag创建了两个不同的TagVisualizations。现在我想在这些可视化之间(在运行时)在外部(在普通的WPF窗口中)切换。
我的临时解决方案: 首先,我刚刚编写了一个方法,在单击外部窗口后添加或更改当前可视化(指向不同的xaml文件)。
private void addTagVisualization(String tagvisualization)
{
ByteTagVisualizationDefinition def1 = new ByteTagVisualizationDefinition
{
Value = 192,
Source = new Uri(tagvisualization, UriKind.Relative),
UsesTagOrientation = true,
TagRemovedBehavior = TagRemovedBehavior.Fade,
PhysicalCenterOffsetFromTag = new Vector(0, 0)
};
TagVisualizer tagvis1 = new TagVisualizer();
tagvis1.Definitions.Add(def1);
grid.Children.Add(tagvis1);
}
问题:
当我在WPF窗口中单击“更改标签化”时,Surface获取新连接但不刷新 - 所以我必须上下放置标签以查看新的可视化。如何让表面识别出一个新的对象 - 即使它已经在表面上并且没有移动?
我尝试了一切:invalidateVisual,children.clear(),通过XAMLReader加载文件 - 它始终是相同的: 我必须上下标记以查看新的可视化。我认为这是同样的问题,就像在所有示例中一样:标签工作,当它们在示例开始后移动时。但是当我在选择示例之前将标记放在表面上时 - 应用程序没有获得标记....
有谁知道该怎么办?我知道这在某种程度上在Core-Layer中有效,但是在WPF中也必须有一个解决方案吗?
提前致谢!
第二次尝试:
我试图保存联系人,以便稍后捕获它。它工作得更好:点击changeTagVisualization后,标签不会失去“识别”,只会失去其可视化。 点击后,它看起来像标签没有可视化但被表面识别。当我上下放置时,会出现新的TagVisualization。什么是缺失的链接??
主窗口的XAML代码:
<s:SurfaceWindow (Namespacedefinitions...)>
<Grid x:Name="grid" s:Contacts.GotContactCapture="gotIt" />
</s:SurfaceWindow>
主窗口的C#代码:
// Here some global parameters
TagVisualizer tagvis1;
Contact tagContact;
int style = 1;
...
// A method that saves the tag, when added the first time to surface
private void gotIt(object sender, ContactEventArgs e){
tagContact = e.Contact
}
...
// The method which switches between the XAML-Files and loads different visualizations
private void addTagVisualization() {
ByteTagVisualizationDefinition defByte = ByteTagVisualizationDefinition();
defByte.value = 9;
defByte.LostTagTimeout = 0;
if(style == 1) {
defByte.Source = new Uri("TagVisualization1.xaml", UriKind.Relative)
}
else {
defByte.Source = new Uri("TagVisualization2.xaml", UriKind.Relative)
}
this.tagvis1 = new TagVisualizer();
tagvis1.Definitions.Add(defByte);
grid.Children.Add(tagvis1);
}
// I think here is the mistake: a method, which is called from my external window.
// after a click on changeVisualization the style parameter switches
// I clear the old visualization in order to add it once again with a different xaml
// then I capture the object and invalidate
public void setStyle(int style) {
this.style = style;
grid.Children.Clear();
addTagVisualization();
tag.Capture(tagvis1);
base.InvalidateVisual();
}
答案 0 :(得分:0)
想象一下,即使已按下鼠标按钮,您也向窗口添加了一个按钮并将该按钮放在鼠标下方。如果按钮出现在按钮下方按下鼠标按钮,按钮将不会自动“点击”。
TagVisualizer的方式是相同的 - 它只关注标记在其上的标记或者它正式被控制的标记。那么,您如何正式对联系人进行正式控制呢?这就是“捕获”的用武之地。找到代表标记的Contact对象,然后调用contact.Capture(tagvisualizer)
。那应该是诀窍!
请记住,尽管可能比动态创建新的TagVisualizer更好的设计是简单地修改可视化定义的Source属性。另一个替代方案是动态地改变tagvisualization元素本身的内容。