Я работаю над проектом WPF-Surface и уже создал две разные TagVisualizations для одного ByteTag.Теперь я хочу переключаться извне (в обычном 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);
}
Проблема:
Когда я нажимаю «Изменить Tagvisualization» в моем окне 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();
}