Интерактивность системных окон, как подключиться

Обновлено: 03.07.2024

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

Verlinkungsproblem: System.Windows.Interactivity keine gültige Namespace-ID

Ich bin gerade dabei, ein Beispiel bzg. MVVM nachzubauen. Dort geht es gerade um EventTrigger-Object aus der Interactivity.dll - Erweiterung.

Ich kriege leider einen dicken Fehler, beim Versuch, den CLR-Namespace der Erweiterung bekannt zu geben:

Fehler
Der URI "clr-namespace:System.Windows.Interactivity; сборка =System.Windows.Interactivity" является ключевым идентификатором пространства-имени

Посмотрите, где вы находитесь, имейте в виду, что ссылка на библиотеку (Siehe Bild), ключевое слово Fehler jedoch bei folgendem XAML-код:
Nun meine Frage: Было ли mache ich falsch?

Данке Шнмаль,
MfG Робин

Дабэй на момент: 20.07.2008
Показ: 15.634

Создайте DLL из пакета NuGet из Blend SDK. Prim verweist aber glaube ich auch drauf.
Hast Du das verwendet, oder wie hast Du die Referenz hinzugefügt?

PS: Dein Beispiel scheint schon ein paar Monate auf dem Buckel zu haben.
Wär evtl. empfehlenswert ein aktuelleres Beispiel zu nehmen, denn die DLL wird schon ewig nicht mehr gepflegt bzw. это Blend und auch das SDK schon seit Jahren abgekündigt und eingestellt.

- производительность – это функция –

Dabei seit: 03.02.2012
Рейтинг: 1.682
Геркунфт: Дюссельдорф

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

Ich habe einer Anleitung von der NuGet-Seite. Dort habe ich mit in der Nuget-Console versucht, das Package hinzuzufügen - был auch klappte.

Может быть, вы выбрали альтернативу, а не событие в ViewModel zu reagieren? (Код в XAML-коде программной части).

Данке.
Мастер Робин

Дабей на момент: 15.01.2009
Показ: 177

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

Danke für dein TestProjekt - kannst du das kompilieren? Ich nämlich nicht. Пакеты не устанавливаются (размещаются), если вы не находите другие пространства имен:/ Verstehe ich nicht :(

Ich habe jetzt ein neues Projekt gemacht (*Klick*). Вместе с NuGet можно использовать графический интерфейс пользователя Interactivity.dll. Hat auch geklappt, dachte ich.

Возможность использовать пространство имен и другие теги с i:Interaction.Triggers (schonmal ein Fortschritt) с указанием значения, которое было сделано позже Fehler.

An dieser Stelle ist das Buch echt nicht gut beschrieben. Ich vermute, dass es ein paar Kleinigkeiten sind, die ich bisher nicht verstanden habe. Vielleicht magst du mal drüber schauen?

P.S. Извините за Dropbox-Link, Zip от Projekt ist über der maximalen Uploadhöhe:/

дата: 06.07.2014
Статья: 985

Был ли в Visual Studio такой смысл? 2017, 2015, .

(kann man auch im Profilhinterlegen)

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

Дабей на момент: 15.01.2009
Показ: 177

Был установленный DropBox Projekt имеет фальшивый пакет Nuget Installiert. Das ist bei mir auch nicht lauffähig. Das Nuget Package создан без использования Microsoft Veröffentlicht Worden.

Необходим пакет Nuget "Expression.Blend.Sdk", установленный Microsoft при установке.

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

< tr >
Цитат фон
Bei deinem angehängten DropBox Projekt имеет ду дас фальше Nuget Package installiert. Das ist bei mir auch nicht lauffähig. Этот пакет Nuget создан на основе проверенных слов Microsoft.

Es gehört vielleicht nicht mehr zum Thema, aber was hat man falsch gemacht, wenn die InitializeComponents() как Fehler angezeigt wird? Ich habe beim googlen rausbekommen, dass es evt. damit zusammen hängt, dass man verschiedene Namespaces in der XAML/ Codebehind angibt - das ist nicht der Fall. Эйне Иде?


//EDIT: Ich weiß nicht warum, aber das Problem hat sich in Luft aufgelöst. Ist mir jetzt schon öfters passiert, dass Probleme sich nach mehrmaligem neustarten von Visual selbst fixen. это нормально?

дата: 06.07.2014
Статья: 985

Следует использовать метод InitializeComponent() .

Diese Methode ist eine Automatic Generierte Methode und die kann generiert werden oder eben auch nicht. Основой для создания является zugehörige XAML-Datei.

Hier ein Beispiel:

Фон Дизера App.xaml wird folgende App.i.g.cs erzeugt


и nun entfernen wir ainmal den StartupUri Eintrag aus der App.xaml und bekommen Daurch folgende App.igcs erzeugt

Возьмите его в Конструкторе с помощью InitializeComponent(). Метод изменит и изменит метод, если он не будет получен (мы не создадим ничейного генератора), а затем изменим его.

Allerdings sollte in der App -Klasse diese Methode nicht von dir aufgerufen werden. Das macht der genericerte Code von selber (siehe App.i.g.cs) und ein doppeltes Initialisieren kann Probleme verursachen.

Помните, что окно быстро проходит через Gleiche, объединяется с Unterschied, с помощью метода InitializeComponent(), а затем создает метод в конструкторе, который позволяет создать массу.

Der genericerte Code der Methode sorgt dafür, dass die wirkliche Initialisierung in dieser Methode gesichert nur einmal pro Instanz durchlaufen wird, unabhängig davon, wie oft man InitializeComponent() aufruft.

Da es sich um eineAutomatic Generierung von Dateien handelt, kann es durchaus sein, dass dir auch dein Virenscanner einen Streich spielt und einfach mal dazwischen grätscht. Также alle Virenscanner mal totlegen und dann das Verhalten beobachten.

Дата: 26.07.2017
Начало: 38
Herkunft: Bergisch Gladbach

Übrigens etwas, was mir in meiner Zeit mit VS nun aufgefallen ist:

Необходимо использовать Fehler в XAML-коде (z.B. найти класс в пространствах имен и т. д.).

Wenn ich Neustarte kann das das Problem beheben, anderenfalls reicht ein klick auf "Run" и der Fehler löst sich in Luft auf.

(Natürlich nur, wenn auch alles richtig ist.)

Ist für einen Anfänger wie mich sehr ärgerlich, weil man nicht immer sich ja nicht immer sicher ist mit der richtigen Ausführung mancher Befehle.

В рамках урока по шаблону MVVM для приложений WPF мне нужно было добавить библиотеку System.Windows.Interactivity.dll через диспетчер ссылок. Я не нашел его там (версия Visual Studio - 2017). На снимке экрана ниже показано все, что есть в результатах поиска, начиная с System.Windows:

введите сюда описание изображения

Я подумал, что, возможно, эта библиотека уже встроена в новую версию проекта WPF (хотя ее тоже нет в списке уже подключенных ссылок), и когда я добавил следующий код в ApplicationViewModel.cs, ошибок не было. до сих пор отображалось средой разработки:

Однако, когда я добавил код XAML, среда выдала сообщение о том, что clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity не существует в пространстве имен Interaction , EventTrigger и InvokeCommandAction :

Не знаю, как это связано с библиотекой System.Windows.Interactivity, но как решить эту проблему?

1 ответ

Необходимая библиотека является частью Microsoft Expression Blend 4 SDK и не входит в стандартную поставку, но вы всегда можете подключить ее из галереи NuGet: System.Windows.Interactivity.WPF от Microsoft

Пользователи Visual Studio 2017 могут установить Microsoft Blend SDK в систему с помощью Visual Studio Installer, для этого на вкладке «Отдельные компоненты» в разделе «Пакеты SDK, библиотеки и платформы» («SDK, библиотеки и frameworks"), необходимо установить флажок рядом с пунктом "SDK для Microsoft Blend для Visual Studio для платформы .NET" ("Blend для Visual Studio SDK для .NET") и нажать "Изменить".

введите сюда описание изображения

После этого Системная библиотека.Windows. Интерактивность будет доступна в Диспетчере ссылок в разделе Сборки/Расширения

введите сюда описание изображения

Кроме того, Blend SDK можно загрузить и установить в систему из Центра загрузки Microsoft: 3.5, 4.0

На этот раз я пытаюсь использовать MVVM для рисования загруженных данных электронной таблицы на холсте.

Среда

Чтобы использовать шаблон MVVM, я удалил большинство функций из кода MainWindow.xaml.

MainWindow.xaml.cs

Выйти из полноэкранного режима

Добавить модель просмотра

Alt Text
< /p>

Теперь мне нужен класс ViewModel.

События, запускаемые из MainWindow.xaml, обрабатываются классами, реализующими ICommand.
Свойства, привязанные к MainWindow.xaml, контролируются классами, которые реализуют «INotifyPropertyChanged».

И они публикуются классом ViewModel.

LoadCommand.cs

Выйти из полноэкранного режима

WorksheetView.cs

Выйти из полноэкранного режима

MainViewModel.cs

Выйти из полноэкранного режима

Как класс ViewModel узнает, что команда запущена?

Несмотря на то, что MainWindow.xaml запускает LoadCommand, MainViewModel не может знать об этом.

Поэтому LoadCommand нужны действия, а MainViewModel — подписываться на них.

ЗагрузитьSpreadsheetArgs.cs

Выйти из полноэкранного режима

LoadCommand.cs

Выйти из полноэкранного режима

MainViewModel.cs

Выйти из полноэкранного режима

Alt Text
< /p>

Привязать команду к событию ContentRendered

По умолчанию я не могу привязать LoadCommand к событию "ContentRendered".
Конечно, я могу вызвать событие из кода.
Но я не хочу этого делать.

Поэтому я устанавливаю "Microsoft.Xaml.Behaviors.Wpf".

Ранее он назывался "System.Windows.Interactivity".
Большая часть использования такая же, как и раньше.

MainWindow.xaml

Выйти из полноэкранного режима

Модель представления с зависимостями

У меня все еще есть проблема.
Я не могу внедрить зависимости в класс ViewModel или не могу показать MainWindow.

Мы кратко представили действия в Pt. 1, но нужно знать гораздо больше. Чтобы начать наше исследование, мы возьмем наш простой пример «Hello» и посмотрим, как это выглядит, когда мы явно создаем действия, а не используем соглашения. Вот Xaml:

Как видите, функция Actions использует Microsoft.Xaml.Behaviors в качестве механизма запуска. Это означает, что вы можете использовать все, что наследуется от Microsoft.Xaml.Behaviors.TriggerBase, чтобы инициировать отправку ActionMessage.

1 Возможно, наиболее распространенным триггером является EventTrigger, но вы можете создать практически любой тип триггера, который только можно вообразить, или использовать некоторые общие триггеры, уже созданные сообществом. ActionMessage — это, конечно же, часть этой разметки, специфичная для Caliburn.Micro. Это указывает на то, что при срабатывании триггера мы должны отправить сообщение «SayHello». Итак, почему я использую формулировку «отправить сообщение» вместо «выполнить метод» при описании этой функциональности? Это интересная и мощная часть. ActionMessage перемещается по визуальному дереву в поисках целевого экземпляра, который может его обработать. Если цель найдена, но не имеет метода «SayHello», платформа будет продолжать всплывать до тех пор, пока не найдет его, выдавая исключение, если «обработчик» не найден.

2 Эта всплывающая природа ActionMessage удобна в ряде интересных сценариев, ключевой вариант использования — Master/Details. Еще одна важная особенность, на которую следует обратить внимание, — это защитные элементы. Когда обработчик найден для сообщения «SayHello», он проверит, имеет ли этот класс также свойство или метод с именем «CanSayHello». Если у вас есть защитное свойство, и ваш класс реализует INotifyPropertyChanged, то платформа будет отслеживать изменения в этом свойстве и соответствующим образом переоценивать защитное свойство. Подробнее об охране методов мы поговорим ниже.

Цели действий

Возможно, вам интересно, как указать цель сообщения ActionMessage. Глядя на разметку выше, нет видимых указаний на то, какой будет эта цель. Итак, откуда это? Поскольку мы использовали подход Model-First, когда Caliburn.Micro (далее CM) создал представление и привязал его к ViewModel с помощью ViewModelBinder, он настроил это для нас. Для всего, что проходит через ViewModelBinder, автоматически устанавливается цель действия. Но вы также можете установить его самостоятельно, используя прикрепленное свойство Action.Target. Установка этого свойства помещает «обработчик» ActionMessage в визуальном дереве, прикрепленном к узлу, когда вы объявляете свойство. Он также устанавливает для DataContext одно и то же значение, поскольку часто требуется, чтобы эти две вещи были одинаковыми. Однако вы можете изменить Action.Target из DataContext, если хотите. Вместо этого просто используйте присоединенное свойство Action.TargetWithoutContext. Одна приятная особенность Action.Target заключается в том, что вы можете установить для него значение System.String, и CM будет использовать эту строку для разрешения экземпляра из контейнера IoC, используя предоставленное значение в качестве ключа. Это дает вам хороший способ сделать View-First MVVM, если вы того пожелаете. Если вы хотите установить Action.Target, а также применить соглашения Action/Binding, вы можете использовать присоединенное свойство Bind.Model таким же образом.

Просмотреть первым

//Пропустить этот раздел.

Давайте посмотрим, как мы применим это для достижения MVVM с использованием метода View-First (ох! Вот как мы изменим наш загрузчик:

Поскольку мы используем View-First, мы унаследовали его от неуниверсального Bootstrapper. Конфигурация MEF такая же, как и ранее, поэтому для краткости я ее не упомянул.Единственное, что изменилось, это то, как создается представление. В этом сценарии мы просто переопределяем OnStartup, сами создаем экземпляр представления и устанавливаем его как RootVisual (или вызываем Show в случае WPF). Далее мы немного изменим способ экспорта ShellViewModel, добавив контракт с явным именем:

Наконец, мы изменим наше представление, чтобы получить виртуальную машину и выполнить все привязки:

Обратите внимание на использование вложенного свойства Bind.Model. Это разрешает нашу виртуальную машину по ключу из контейнера IoC, устанавливает Action.Target и DataContext и применяет все соглашения. Я подумал, что было бы неплохо показать, как разработка View-First полностью поддерживается CM, но в основном я хочу прояснить различные способы, которыми вы можете устанавливать цели для действий, и последствия использования каждого метода. Вот сводка доступных прикрепленных свойств:

Action.Target Задает для свойства Action.Target и свойства DataContext указанный экземпляр. Строковые значения используются для разрешения экземпляра из контейнера IoC. Action.TargetWithoutContext Задает только свойство Action.Target для указанного экземпляра. Строковые значения используются для разрешения экземпляра из контейнера IoC. Bind.Model View-First — устанавливает для свойств Action.Target и DataContext указанный экземпляр. Применяет соглашения к представлению. Строковые значения используются для разрешения экземпляра из контейнера IoC. (Используйте на корневых узлах, таких как Window/UserControl/Page.) Bind.ModelWithoutContext View-First — устанавливает Action.Target в указанный экземпляр. Применяет соглашения к представлению. (Используйте внутри DataTemplate.) View.Model ViewModel-First — находит представление для указанного экземпляра виртуальной машины и внедряет его на сайт содержимого. Устанавливает для виртуальной машины Action.Target и DataContext. Применяет соглашения к представлению.

Параметры действия

Теперь давайте рассмотрим еще один интересный аспект ActionMessage: параметры. Чтобы увидеть это в действии, давайте вернемся к нашему исходному загрузчику ViewModel-First и т. д. и начнем с изменения нашей ShellViewModel, чтобы она выглядела следующим образом:

Здесь следует отметить несколько вещей. Во-первых, теперь мы работаем с полностью POCO-классом; здесь нет INPC. Во-вторых, мы добавили входной параметр в наш метод SayHello. Наконец, мы изменили наше свойство CanSayHello на метод с теми же входными данными, что и у действия, но с типом возвращаемого значения bool. Теперь давайте посмотрим на Xaml:

Наша разметка теперь имеет одну модификацию: мы объявили параметр как часть ActionMessage, используя привязку ElementName. Вы можете иметь любое количество параметров по вашему желанию. Value — это DependencyProperty, поэтому к параметрам применяются все стандартные возможности привязки. Я упоминал, что все это можно сделать в Blend?

Действия в Blend

Одна хорошая вещь в этом заключается в том, что каждый раз, когда значение параметра изменяется, мы вызываем метод защиты, связанный с действием (в данном случае CanSayHello), и используем его результат для обновления пользовательского интерфейса, который представляет собой ActionMessage. прикреплен к. Идите вперед и запустите приложение. Вы увидите, что он ведет себя так же, как и в предыдущих примерах.

В дополнение к литеральным значениям и выражениям привязки существует ряд полезных «специальных» значений, которые можно использовать с параметрами. Это дает вам удобный способ доступа к общей контекстной информации:

$eventArgs Передает EventArgs или входной параметр вашему действию. Примечание. Это значение будет нулевым для защитных методов, поскольку на самом деле триггер не сработал. $dataContext Передает DataContext элемента, к которому присоединено сообщение ActionMessage. Это очень полезно в сценариях Master/Detail, где ActionMessage может всплывать к родительской виртуальной машине, но должен нести с собой дочерний экземпляр, над которым нужно действовать. $source Фактический элемент FrameworkElement, вызвавший отправку сообщения ActionMessage. $view Представление (обычно UserControl или Window), привязанное к ViewModel. $executionContext Контекст выполнения действия, который содержит всю указанную выше информацию и многое другое. Это полезно в сложных сценариях. $this Фактический элемент пользовательского интерфейса, к которому привязано действие. В этом случае в качестве параметра будет передан не сам элемент, а его свойство по умолчанию.

Переменная должна начинаться с символа «$», но CM обрабатывает имя без учета регистра. Их можно расширить, добавив значения в MessageBinder.SpecialValues.

Примечание. Использование специальных значений, таких как $this или именованный элемент

Если вы не укажете свойство, CM использует значение по умолчанию, указанное в конкретном соглашении об управлении. Для кнопки это свойство оказывается «DataContext», в то время как TextBox по умолчанию имеет значение Text, Selector — SelectedItem и т. д. То же самое происходит при использовании ссылки на другой именованный элемент управления в представлении вместо $this.Следующее: заставляет CM передавать текст, содержащийся в текстовом поле с именем «someTextBox», в MyAction. Причина, по которой фактический контроль никогда не передается действию, заключается в том, что виртуальные машины никогда не должны напрямую работать с элементами пользовательского интерфейса, поэтому соглашение не одобряет это. Обратите внимание, однако, что к самому элементу управления можно легко получить доступ в любом случае, используя расширенный синтаксис (на основе System.Windows.Interactivity) для заполнения параметров или настройки синтаксического анализатора.

Значения перечисления

Если вы хотите передать значения Enum в качестве параметра, вам нужно передать значение в виде строки (в верхнем регистре):

Формы Xamarin

Для Xamarin Forms работает только параметр $this, потому что обход визуального дерева в Xamarin Forms немного отличается.

Слово мудрым

Параметры — это удобная функция. Они очень мощные и могут помочь вам в некоторых сложных ситуациях, но ими легко злоупотреблять. Лично я использую параметры только в самых простых сценариях. Одно место, где они хорошо сработали для меня, — это формы входа. Другой сценарий, как упоминалось ранее, — это операции Master/Detail.

Теперь вы хотите увидеть что-то действительно злое? Измените свой Xaml обратно на это:

Запуск приложения подтвердит, что соглашения CM понимают даже параметры ActionMessage. Мы еще обсудим соглашения в будущем, но вы должны быть рады узнать, что эти соглашения не чувствительны к регистру и могут даже обнаруживать ранее упомянутые «особые» значения.

Всплывающие действия

Теперь давайте рассмотрим простой сценарий Master/Detail, в котором демонстрируется всплывающее сообщение ActionMessage, но давайте сделаем это с помощью сокращенного синтаксиса, более удобного для разработчиков. Мы начнем с добавления простого нового класса с именем Model:

А затем мы изменим нашу ShellViewModel на это:

Теперь в нашей оболочке есть коллекция экземпляров модели, а также возможность добавления или удаления из коллекции. Обратите внимание, что метод Remove принимает один параметр типа Model. Теперь давайте обновим ShellView:

Сообщение.Прикрепить

Первое, на что следует обратить внимание, это то, что мы используем более удобный для разработчиков Xaml механизм для объявления наших сообщений ActionMessages. Свойство Message.Attach поддерживается простым синтаксическим анализатором, который берет вводимый текст и преобразует его в полный Interaction.Trigger/ActionMessage, который вы видели ранее. Если вы работаете преимущественно в редакторе Xaml, а не в конструкторе, вам понравится Message.Attach. Обратите внимание, что ни одно из объявлений Message.Attach не указывает, какое событие должно отправлять сообщение. Если вы пропустите событие, синтаксический анализатор будет использовать ConventionManager для определения события по умолчанию, которое будет использоваться для триггера. В случае с кнопкой это Click. Вы всегда можете быть явным из грубого. Вот как выглядел бы полный синтаксис нашего сообщения об удалении, если бы мы объявляли все:

Предположим, нам нужно переписать наше параметризованное действие SayHello с синтаксисом Message.Attach. Это будет выглядеть так:

Но мы также могли бы использовать некоторые интеллектуальные настройки парсера по умолчанию и сделать это следующим образом:

Вы также можете указать литералы в качестве параметров и даже объявить несколько действий, разделив их точкой с запятой:

Читайте также: