在运行时更改TagVisualization - Surface不刷新

时间:2011-03-24 18:17:33

标签: c# wpf pixelsense

我正在开发一个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();
}

1 个答案:

答案 0 :(得分:0)

想象一下,即使已按下鼠标按钮,您也向窗口添加了一个按钮并将该按钮放在鼠标下方。如果按钮出现在按钮下方按下鼠标按钮,按钮将不会自动“点击”。

TagVisualizer的方式是相同的 - 它只关注标记在其上的标记或者它正式被控制的标记。那么,您如何正式对联系人进行正式控制呢?这就是“捕获”的用武之地。找到代表标记的Contact对象,然后调用contact.Capture(tagvisualizer)。那应该是诀窍!

请记住,尽管可能比动态创建新的TagVisualizer更好的设计是简单地修改可视化定义的Source属性。另一个替代方案是动态地改变tagvisualization元素本身的内容。