powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Вопросы начинающего в Xml
25 сообщений из 25, страница 1 из 1
Вопросы начинающего в Xml
    #38868941
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите плиз, есть ли такая возможность в WPF, как однократное указание для Command иконки, и чтобы после привязки к MeuItem или Button эта иконка тоже появлялась?

Если нет, то как решается такая задача? Неужели для каждого объекта, где есть ссылка на команду, нужно создавать Image c Source=Icons/Image1.png?
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38868993
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Делаем свою реализацию ICommand c DependencyPropetry типа ImageSource.
2. Оверрайдим default template, в темплейте где нужно размещаем Image, биндим его ImageSource на Command.ImageSource.
Только это не вполне идеологически правильно, т.к. команда определяется в модели, которая ничего не должна знать о View - в т.ч. об иконках на его кнопках.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869016
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

мм мне такая реализация не по душе :)

есть RoutedUICommand класс, я бы на основе него делал команду с ништяками :) имхо, конечно
а вот уже слушатель маршрутизируемых команд должен связывать RelayCommand'ы с RoutedCommand.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869017
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это я,

и да, не XML, а XAML =) начни хотя бы с того, чтобы запомнить.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869433
Roman0888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, помогите мне пожалуйста с этим http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869437
Roman0888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman0888Сон Веры Павловны, помогите мне пожалуйста с этим http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=

Как сделать Signature в XML файле?
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869486
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesДа, это я,

и да, не XML, а XAML =) начни хотя бы с того, чтобы запомнить.
Это я опечатался. Время позднее, не обратил внимания.

Речь идет именно о routed UI command. Я как то предположил, что раз оно UI , то информацию об иконке можно хранить с ней. Ведь названия и шорткаты хранятся. Где же здесь концептуальная ошибка?


Собственно, впф я начал учить только пару дней как. Хотелось бы сразу делать "правильно". До этого винформс и делфи, что мешает.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869626
guest123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, это я,

Обычно используют обёртку поверх Command и биндят к кнопкам и меню уже её:
Код: c#
1.
2.
3.
4.
5.
6.
7.
public interface IAction
{
    ICommand Command { get; set; }  
    string Name { get; set; }
    ImageSource Icon { get; set; }
    List<IAction> ChildActions { get; set;} 
}
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869644
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest123456,

Вас не затруднит пример выводить выложить? Хотя бы с одной кнопкой.

То есть команда с текстом, картинкой и шорткатом и в меню, и на кнопке.

Буду очень благодарен
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869658
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это яguest123456,

Вас не затруднит пример выводить выложить? Хотя бы с одной кнопкой.

То есть команда с текстом, картинкой и шорткатом и в меню, и на кнопке.

Буду очень благодарен

Вот первый повавшийся пример.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869808
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ilya81,

Пример, скажем честно, неудачный.

Попробую наваять что нить, сюда выложу, чтобы покритиковали
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38869885
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это я,

утром завтра скину вам пример с RouteUICommand и привязкой их к RelayCommand в ViewModel. Как по мне, самый удобный вариант.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870060
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обычно никаких RelayCommand для RouteUICommand не использую, только сам CommandBinding у меня чаще в коде, чем в XAML'е, но обработчики обычно - просто методы того ж класса. Скажем, так
Код: c#
1.
CommandManager.RegisterClassCommandBinding(typeof(UIElement), new CommandBinding(ApplicationCommands.Save, OnSaveExectued));


И вызывается, скажем, в каком-нибудь статическом конструкторе.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870185
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это я,

http://rghost.ru/8HcYfTnh7
вот тут скинул проект
ImagingCommand - это класс для маршрутизирумых команд
CommandListener - это статический класс содержит прикрепляемое свойство, свойство это коллекция для элментов CommandBind, для связывания маршрутизируемой команды и команды в модели представления
Так же есть файл со стилями для MenuItem и Button, для отображения картинки и текста на кнопке и в меню
будут вопросы, пишите :)

если у кого есть замечания, буду рад выслушать
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870230
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Воистину ты великий человек, о Фангахра!

Ушел разбирать проект по косточками и читать хелп по использованным классам.

Спасибо!
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870360
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesесли у кого есть замечания, буду рад выслушать
Нет иконок у всех MenuItem'ов - т.к. стиль для них вынесен в РД, то стиль создается в 1 экземпляре => Image создается в 1 экземпляре => Image остается на последнем контроле, которому был присвоен (в данном случае - вообще непонятно на каком). Фиксится вот так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<Image
  x:Key="MenuIconImage"
  x:Shared="false"
  Source="{Binding Command.Image, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}}"/>
<Style TargetType="{x:Type MenuItem}">
  <Setter Property="Icon" Value="{StaticResource MenuIconImage}" />
</Style>
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870454
АБВГДЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это что получается, из XAML можно ссылаться на команду только через x:Static?

Посмотрите плиз код на предмет неправильного понимания сути. Мне нужно, чтобы команда могла цепляться к любому элементу интерфейса, и при этом этот элемент мог иметь возможность а) выводить текст б) отображать картинку в) отображать закрепленный за командой шорткат. Хотелось бы еще, чтобы команда могла понимать, кто её вызвал.

Ну и вопросы: нужно ли в команде поддерживать INotifyPropertyChanged, и зачем для RoutedUICommand нужен OwnerType ?

Кусок кода - команда
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
    public abstract class CustomUICommandBase: ICommand, INotifyPropertyChanged
    {
        #region Private members
        private string _text;
        private string _inputGestureText;
        private ImageSource _icon;
        private KeyGesture _gesture;
        private readonly Func<object, bool> _condition;
        private readonly Action<object> _action;
        #endregion

        #region Properties
        public Type OwnerType { get; private set; }
        public KeyGesture Gesture
        {
            get { return _gesture; }
            set
            {
                if (Equals(value, _gesture)) return;
                _gesture = value;

                InputGestureText = GetGuestureTextFrom(_gesture);
                OnPropertyChanged();
            }
        }
        public string InputGestureText
        {
            get { return _inputGestureText; }
            private set
            {
                if (value == _inputGestureText) return;
                _inputGestureText = value;
                OnPropertyChanged();
            }
        }
        public string Text
        {
            get { return _text; }
            set
            {
                if (value == _text) return;
                _text = value;
                OnPropertyChanged();
            }
        }
        public ImageSource Icon
        {
            get { return _icon; }
            set
            {
                if (Equals(value, _icon)) return;
                _icon = value;
                OnPropertyChanged();
            }
        } 
        #endregion

        #region ICommand
        public bool CanExecute(object parameter)
        {
            return (null == _condition) || _condition(parameter);
        }
        public void Execute(object parameter)
        {
            _action(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        #endregion

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        } 
        #endregion

        #region .ctor
        protected CustomUICommandBase(Action<object> action, Func<object, bool> condition = null, Type type = null)
        {
            _action = action;
            _condition = condition;
            OwnerType = type;
        } 
        #endregion

        public static string GetGuestureTextFrom(KeyGesture gesture)
        {
            if (default(KeyGesture) == gesture)
                return String.Empty;

            string defaultModifier = default(ModifierKeys).ToString();

            string key = gesture.Key.ToString();
            string modifierAlt = (ModifierKeys.Alt & gesture.Modifiers).ToString();
            string modifierControl = (ModifierKeys.Control & gesture.Modifiers).ToString();
            string modifierShift = (ModifierKeys.Shift & gesture.Modifiers).ToString();
            string modifierWindows = (ModifierKeys.Windows & gesture.Modifiers).ToString();

            return string.Format(
                "{0}{1}{2}{3}{4}",
                0 == String.CompareOrdinal(modifierControl, defaultModifier) ? String.Empty : "Ctrl+",
                0 == String.CompareOrdinal(modifierAlt, defaultModifier) ? String.Empty : "Alt+",
                0 == String.CompareOrdinal(modifierShift, defaultModifier) ? String.Empty : "Shift+",
                0 == String.CompareOrdinal(modifierWindows, defaultModifier) ? String.Empty : "Win+",
                key);
        }
    }

    public class ExitUICommand : CustomUICommandBase
    {
        private static readonly Action<object> _action = o =>
            {
                if (MessageBoxResult.Yes == MessageBox.Show("Вы уверены, что хотите завершить приложение?", "Подтверждение выхода", MessageBoxButton.YesNo, MessageBoxImage.Question))
                    Application.Current.Shutdown();
            };

        public ExitUICommand(Action<object> action, Func<object, bool> condition = null, Type type = null) 
            : base(action, condition, type) { }

        public ExitUICommand(Func<object, bool> condition = null, Type type = null)
            : base(_action, condition, type) { }
    }

...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870460
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

=) гы и правда, ну тогда можно вот так, как вариант:

Код: xml
1.
2.
3.
4.
    <Image x:Key="MenuImage" x:Shared="False" Source="{Binding Command.Image, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}}"/>
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="Icon" Value="{StaticResource MenuImage}"/>
    </Style>
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870466
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АБВГДЕЙ,

команды можно цеплять к элементам элементам, которые наследуют интерфейс ICommandSource
Если нужно, можно наследовать нужный вам контрол и определить в нём интерфейс, ну или на худой конец поле для команды, которую бы будите возбуждать в событии контрола.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870472
АБВГДЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesАБВГДЕЙ,

команды можно цеплять к элементам элементам, которые наследуют интерфейс ICommandSource
Если нужно, можно наследовать нужный вам контрол и определить в нём интерфейс, ну или на худой конец поле для команды, которую бы будите возбуждать в событии контрола.

Ок, неясно выразился. Не любому элементу интерфейса, а тому, который из коробки поддерживает команды. Типа Меню, КонтекстМеню, Баттон.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870630
АБВГДЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного прояснилось, но есть вопросы.

Я создал по аналогии с примером класс RoutedCommands и в нем добавил статическую команду
RoutedCommands
Код: c#
1.
2.
3.
4.
    public class RoutedCommands
    {
        public static ICommand QuitCommand = new ExitUICommand() {Gesture = new KeyGesture(Key.Q, ModifierKeys.Control), Text = "Quit", Icon = new BitmapImage(new Uri("/Market;component/Images/delete.png", UriKind.Relative))};
    }



А в MainWindow.xaml прописал:
MainWindow.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:uiCommands="clr-namespace:Market.UICommands"
        x:Class="Market.MainWindow"
        Title="MainWindow" Height="466" Width="974" Loaded="Window_Loaded">

    <Window.InputBindings>
        <KeyBinding Key="Q" Modifiers="Control" Command="{x:Static uiCommands:RoutedCommands.QuitCommand}"></KeyBinding>
    </Window.InputBindings>
    
    <DockPanel LastChildFill="True">
        <Menu x:Name="MainMenu" DockPanel.Dock="Top">
            <MenuItem Header="_Файл">
                <Separator/>
                <MenuItem 
                    InputGestureText="{Binding Command.InputGestureText, RelativeSource={RelativeSource Self}}" 
                    Header="{Binding Command.Text, RelativeSource={RelativeSource Self}}" 
                    Command="{x:Static uiCommands:RoutedCommands.QuitCommand}"/>
            </MenuItem>
        </Menu>

        <DockPanel DockPanel.Dock="Top">
            <ToolBar DockPanel.Dock="Left">
                <Button Command="{x:Static uiCommands:RoutedCommands.QuitCommand}">
                    <Image Source="{Binding Command.Icon, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Width="16" Height="16"/>
                </Button>
            </ToolBar>
        </DockPanel>

        <TabControl DockPanel.Dock="Bottom">
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5">
                    <Button Command="{x:Static uiCommands:RoutedCommands.QuitCommand}">
                        <TextBlock Text="{Binding Command.Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></TextBlock>
                    </Button>
                </Grid>
            </TabItem>
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
        </TabControl>
    </DockPanel>
</Window>



Так вот, почему то без <Window.InputBindings> шорткаты не работают, хотя при создании команды я их прописал. Если для Window их обязательно нужно указывать, нельзя ли автоматом цеплять из Command?

И второе: если я в Image не укажу Width="16" Height="16", то картинка увеличивается на пол экрана. Почему? В исходном примере никаких явных указаний размера не нашел, а картинка нормального размера.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870678
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АБВГДЕЙ,

выше выкладывал пример с CommandListener, чисто теоретически, при добавлении команды в коллекцию, не проблема к объекту которому вы аттачите свойство слушателя прикрепить InputBinding или просто прослушивать события клавиатуры.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38870688
АБВГДЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesАБВГДЕЙ,

выше выкладывал пример с CommandListener, чисто теоретически, при добавлении команды в коллекцию, не проблема к объекту которому вы аттачите свойство слушателя прикрепить InputBinding или просто прослушивать события клавиатуры.

Роман, спасибо за пример. Я его все еще изучаю, слишком много новых концепций для меня там, пока не врубился во все.
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38871587
АБВГДЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesДа, это я,

http://rghost.ru/8HcYfTnh7
вот тут скинул проект
ImagingCommand - это класс для маршрутизирумых команд
CommandListener - это статический класс содержит прикрепляемое свойство, свойство это коллекция для элментов CommandBind, для связывания маршрутизируемой команды и команды в модели представления
Так же есть файл со стилями для MenuItem и Button, для отображения картинки и текста на кнопке и в меню
будут вопросы, пишите :)

если у кого есть замечания, буду рад выслушать

Роман, вы не объясните в вашем проекте реализацию CommandBind?

1) Зачем наследовать от Freezable
2) Зачем делать ему зависимые свойства? Почему нельзя прописать как обычные?
3) Что за IsHandled?
...
Рейтинг: 0 / 0
Вопросы начинающего в Xml
    #38871631
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АБВГДЕЙ,

1. классы наследуются от Freezable и FreezableCollection, для возможности связывание (Binding) с моделью представления. Я не сильно вникал в суть того, как именно работает этот базовый класс, да мне это и не особо нужно. Суть в том, что без наследования этого класса невозможно создать связывание, если объект не находится в логическом дереве.

2. Для связывания свойства со свойством необходимо, чтобы одно из свойств (приёмник или источник) было обязательно зависимым. Невозможно связать 2 обычных свойства через Binding. Только dependency (или attached) property с обычным свойством или DP с DP.

3. IsHandled значит, что данная маршрутизируемая команда обработана. RoutedCommand основаный на RoutedEvent и являются всплывающими событиями (Bubble). Если у вас в визуальном дереве используется 2 CommandLisnter'а, то может получиться так, что команда всплывая будет обработана обоими слушателями и команда выполнится 2жды в разных местах. По этому, если вам не нужна повторная обработка команды, вы 1 из CommandBind IsHandled = true и всплытие прекратится.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Вопросы начинающего в Xml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]