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

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

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

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

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

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

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

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


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

Обычно используют обёртку поверх 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
02.02.2015, 16:31
    #38869644
Да, это я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
guest123456,

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Спасибо!
...
Рейтинг: 0 / 0
03.02.2015, 13:45
    #38870360
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
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
03.02.2015, 14:59
    #38870454
АБВГДЕЙ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
Это что получается, из 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
03.02.2015, 15:03
    #38870460
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
Сон Веры Павловны,

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

Код: 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
03.02.2015, 15:06
    #38870466
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
АБВГДЕЙ,

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

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

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

Я создал по аналогии с примером класс 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
03.02.2015, 18:02
    #38870678
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы начинающего в Xml
АБВГДЕЙ,

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

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

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

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

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

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

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

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
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Вопросы начинающего в Xml / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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