|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
Доброго, что то никак не придумаю как правильно нагуглить запрос. хочу понять по какому принципу xaml разметка находит предопределенную команду из к примеру ApplicationCommands смысл в следующем к примеру у нас есть окно: как разметка прекрасно находит комманду по строке "Open"? и что нужно сделать что бы конструкция <Button Command="MyCommand2" /> заработала? то есть хотелось бы добиться эффекта что бы свои кастомные команды можно было как то зарегистрировать, что бы не обращаться к ним через привязки/статики и.т.д Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 19:22 |
|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
felix_ff как разметка прекрасно находит комманду по строке "Open"? В данном случае эта "Open" соответствует команде ApplicationCommands.Open. Как это устанавливает разметка (и почему нет ни указания пространства имён, ни имени содержащего класса): 1. Класс System.Windows.Input.ApplicationCommands находится в сборке PresentationCore. У неё в AssemblyInfo указано: Код: c# 1. 2. 3.
- этими инструкциями осуществляется маппинг пространства имен с URI=http://schemas.microsoft.com/winfx/2006/xaml/presentation на дотнетовский неймспейс System.Windows.Input (пространство имен XAML в общем случае может относиться к нескольким неймспейсам дотнета). Поскольку обычно в XAML-разметке указывается xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" (дефолтный неймспес), то для мемберов ApplicationCommands неймспейс не задается. P.S. Я не смог повторить это, если XmlnsPrefix и XmlnsDefinition заданы в текущей сборке. В сборках из референсов это работает прекрасно. 2. Почему необязательно указывать и имя класса ApplicationCommands: при старте приложения загрузчик XAML, видя у команды строковый литерал, скармливает этот литерал классу CommandConverter из сборки PresentationFramework, чтобы определить команду, соответствующую заданной строке. И в этом конвертере просто вхардкодено: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
- вот и вся магия. В общем случае для того, чтобы свою команду указать в виде строки, нужно объявить статический экземпляр RoutedCommand/RoutedUICommand в статическом классе: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
тогда в разметке можно будет просто указать Код: c# 1. 2.
Но сами по себе экземпляры RoutedCommand/RoutedUICommand никакой прикладной логики не содержат - они просто вверх по визуальному дереву пробрасывают события CanExecuted/Executed. Эти события обрабатываются при наличии обработчика у соответствующих событий CommandBinding из коллекции UIElement.CommandBindings - это подробно расписано в документации. Также существуют многочисленные сторонние реализации, где вместо событий используются ICommand - см. здесь , здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 07:58 |
|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Благодарю! Как раз до потрохов CommandConverter я не добрался, мне как раз и было интересно как разметка умеет правильно конвертить обычную строку без указания конкретного класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 12:14 |
|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
felix_ff хочу понять по какому принципу xaml разметка находит предопределенную команду из к примеру ApplicationCommands felix_ff, просто до невозможности. В исходниках тупо сравнивается строка со всеми дефолтными командами. Небольшой участок исходников CommandConverter с 246 строки : Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Банальный switch-case на все допустимые значения строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 23:17 |
|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
Eld Hasp, да я уже посмотрел давно исходники :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 13:39 |
|
доступ к команде по имени из XAML
|
|||
---|---|---|---|
#18+
felix_ff , наверное, можно что-то наколдовать в рунтайме через свой конвертер и TypeDescriptor.AddAttributes к ICommand. Но как это сделать чтобы в режиме разработки Дизайнер XAML это принял - я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:38 |
|
|
Start [/forum/topic.php?fid=21&fpage=1&tid=1440231]: |
0ms |
get settings: |
19ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
193ms |
get tp. blocked users: |
2ms |
others: | 352ms |
total: | 675ms |
0 / 0 |