Кажется, что стандарты 360video / VR все еще находятся в движении. Эта статья http://labs.dash.umn.edu/etc-lab/detecting-spherical-media-files/ (от апреля 2016 года) предполагает, что проверка свойств EXIF для фото / видео может выявить шаблон в метаданных. Доступны библиотеки для доступа к данным EXIF из файлов, например: https://github.com/exif-js/exif-js . Также существуют библиотеки PHP. Сайт Фила Харви ( http://www.sno.phy.queensu.ca/~phil/exiftool/ ) содержит множество примеров информации и кодирования. Скомпилированные инструменты для WIN, MAC и NIX и библиотеки C ++. Из личного опыта значения EXIF можно читать из файлов JPEG. Я никогда не пробовал обращаться к 360 JPEG, но я понимаю, что фотофайлы, созданные из сферических камер, представляют собой не что иное, как обычные JPEG (хотя изображения выглядят искаженными при просмотре без 360 зрителей). Инструмент EXIF, который написал Фил Харви, показывает поддержку mp4. Вы можете использовать инструмент для анализа 360 видеороликов для поиска различимых шаблонов в метаданных.
Я искал, как сделать что-то подобное в WPF, и я получил это решение:
<ItemsControl ItemsSource="{Binding MyItems,Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton
Content="{Binding}"
Command="{Binding Path=DataContext.CustomCommand,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ItemsControl}} }"
CommandParameter="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
Надеюсь, это сработает для кого-то другого. У меня есть контекст данных, который автоматически устанавливается в ItemsControls, и этот контекст данных имеет два свойства: MyItems
, который представляет собой коллекцию, и одну команду «CustomCommand». Из-за ItemTemplate
используется DataTemplate
, DataContext
верхних уровней недоступен напрямую. Тогда обходной путь для получения DC родителя использует относительный путь и фильтр по типу ItemsControl
.
Вы можете использовать RelativeSource
, чтобы найти родительский элемент, например:
Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified,
RelativeSource={RelativeSource AncestorType={x:Type local:YourParentElementType}}}"
Подробнее о RelativeSource
см. этот вопрос SO .
Mode=FindAncestor
, чтобы он работал, но это работает и намного лучше в сценарии MVVM, потому что он избегает элементов управления именованиями. Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:YourParentElementType}}}"
– Aphex
12 August 2011 в 16:37
RelativeSource vs. ElementName
Эти два подхода могут достичь того же результата,
RelativeSrouce
Binding="{Binding Path=DataContext.MyBindingProperty,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Этот метод ищет контроль над окном типа (в этом примере) в визуальном дереве, и когда он его находит, вы в основном можете получить доступ к DataContext
, используя Path=DataContext....
. Плюсы этого метода заключаются в том, что вам не нужно привязываться к имени, и это своего рода динамика, однако изменения, внесенные в ваше визуальное дерево, могут повлиять на этот метод и, возможно, сломать его.
ElementName
Binding="{Binding Path=DataContext.MyBindingProperty, ElementName=MyMainWindow}
Этот метод относится к твердому статическому Name
, так что пока ваша область видится, вы в порядке. Вы должны придерживаться своего соглашения об именах, а не для разрыва этого метода, конечно. Подход является простым простым, и все, что вам нужно, это указать Name="..."
для вашего окна / UserControl.
Хотя все три типа (RelativeSource, Source, ElementName
) способны выполнять То же самое, но в соответствии со следующей статьей MSDN, каждый из них лучше использовать в своей области специальности.
Найдите краткое описание каждого из них плюс ссылку на более подробную информацию в таблице внизу стр.
проблема заключается в том, что DataTemplate не является частью элемента, к которому он применяется.
это означает, что если вы привязываетесь к шаблону, который вы привязываете к тому, что не имеет контекста.
однако, если вы поместили элемент внутри шаблона, тогда, когда этот элемент применяется к родительскому объекту, он получает контекст, и привязка затем работает
, поэтому это не сработает
<DataTemplate >
<DataTemplate.Resources>
<CollectionViewSource x:Key="projects" Source="{Binding Projects}" >
, но это отлично работает
<DataTemplate >
<GroupBox Header="Projects">
<GroupBox.Resources>
<CollectionViewSource x:Key="projects" Source="{Binding Projects}" >
, поскольку после применения набора данных групповой пакет помещается в родительский элемент и будет иметь доступ к его Контексту
, поэтому все, что вам нужно сделать удаляет стиль из шаблона и перемещает его в элемент в шаблоне
. Обратите внимание, что контекст элемента управления элементами - это элемент, а не элемент управления, т.е. ComboBoxItem для ComboBox, а не сам ComboBox, в этом случае вы должны использовать элементы управления ItemContainerStyle вместо