Изменить TagVisualization во время выполнения - Поверхность не обновляется - PullRequest
0 голосов
/ 24 марта 2011

Я работаю над проектом 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();
}

1 Ответ

0 голосов
/ 25 марта 2011

Представьте, что вы добавили кнопку в свое окно и поместили эту кнопку под мышью, даже если кнопка мыши уже была нажата.Кнопка не будет автоматически «щелкать», если кнопка мыши уже была нажата, когда кнопка появилась под ней.

TagVisualizer - это то же самое - он обращает внимание только на теги, которые нажимаются или формальноучитывая контроль.Итак, как вы формально даете элемент формального контроля над контактом?Вот тут-то и появляется «capture». Найдите объект Contact, представляющий тег, а затем вызовите contact.Capture(tagvisualizer).Это должно сработать!

Имейте в виду, что, вероятно, лучше, чем динамическое создание новых TagVisualizer, было бы просто изменить свойство Source вашего определения визуализации.Другой альтернативой было бы динамическое изменение содержимого самого элемента tagvisualization.

...