Присоедините ICommand в WPF UserControl

нашел решение: просто обновите до версии 3.6.2

Редактировать:

Пожалуйста, просмотрите эту проблему на странице плагина:

https: / /github.com/chingyawhao/materialize-clockpicker/issues/40

7
задан Dave Swersky 13 March 2009 в 17:12
поделиться

4 ответа

Можно достигнуть этого в намного более чистом способе использовать стиль и несколько приложенных свойств.

Приложенные свойства будут хранить Вашу определенную информацию. Стиль будет использовать эти свойства и создавать взгляд, который Вы хотите.

Элемент все еще будет кнопкой так команда, и все остальное будет работать.

 public class ImageButton
    {

        public static ImageSource GetImage(DependencyObject obj)
        {
            return (ImageSource)obj.GetValue(ImageProperty);
        }

        public static void SetImage(DependencyObject obj, ImageSource value)
        {
            obj.SetValue(ImageProperty, value);
        }

        public static readonly DependencyProperty ImageProperty =
            DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ImageButton), new UIPropertyMetadata(null));

        public static String GetCaption(DependencyObject obj)
        {
            return (String)obj.GetValue(CaptionProperty);
        }

        public static void SetCaption(DependencyObject obj, String value)
        {
            obj.SetValue(CaptionProperty, value);
        }

        public static readonly DependencyProperty CaptionProperty =
            DependencyProperty.RegisterAttached("Caption", typeof(String), typeof(ImageButton), new UIPropertyMetadata(null));

    }

<Style TargetType="{x:Type Button}"
               x:Key="ImageButton">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding Path=(local:ImageButton.Image), RelativeSource={RelativeSource AncestorType={x:Type Button}}}" />
                            <TextBlock Text="{Binding Path=(local:ImageButton.Caption), RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
                                       Margin="2,0,0,0" />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>   
        </Style>

Можно затем использовать это для объявления кнопок:

   <Button Style="{DynamicResource ImageButton}"
                        local:ImageButton.Caption="Foo" 
                        local:ImageButton.Image="..." />

Примечание:

Я вполне уверен, это было бы более чисто, чтобы пройти свойство "Template" и использовать ControlTemplate и TemplateBindings, но это будет означать воссоздавать границу и другой материал вокруг Вашего содержания, поэтому если Вы будете надеяться просто определять значение по умолчанию "Содержание", моим примером был бы способ пойти, я думаю.

7
ответ дан 6 December 2019 в 21:20
поделиться

Если единственная добавленная функциональность, которую Вы хотите для своей кнопки, должна иметь изображение на ней, то я думаю, что Вы приближаетесь к этому от неправильного направления. WPF является столь же потрясающим, как это - потому что средства управления UI являются взглядом меньше. Это означает, что Управление является просто определением функциональности + некоторый шаблон, чтобы определить, как это смотрит. Это означает, что шаблон может быть выгружен в любое время для изменения взгляда. Кроме того, почти любое содержание может быть помещено почти в любом управлении

Например, для определения кнопки в xaml, который имеет взгляд движение для всего, Вам нужно, это:

<Window ...>
    ...
    <Button Command="{Binding AttachContextCommand}">
        <StackPanel Orientation="Horizontal">
            <Image Source="{StaticResource AssociateImage}"/>
            <TextBlock Text="Associer"/>
        </StackPanel>
    </Button>
    ...
</Window>

Просто имейте в виду, что с WPF Вы не должны определять новый CustomControl или UserControl каждый раз, когда Вы хотите изменить стиль чего-то. Единственное время необходимо быть нужен CustomControl, - то, если Вы хотите добавить функциональность к существующему Управлению или создать функциональность, которая не существует ни в каком другом Управлении.

Редактирование, Должное прокомментировать:

Если Вы желаете удержаться от определения содержания для кнопки каждый раз, другая опция состоит в том, чтобы просто иметь постепенно (простой объект CLR) класс, который определил бы все Ваше заинтересованное (я запишу свой пример, как будто Вы делаете это для панели инструментов, потому что это имеет смысл мне):

public class ToolBarItem : INotifyPropertyChanged
{
    public string Text { get ... set ... }
    public ICommand Command { get ... set ... }
    public ImageSource Image { get ... set ... }
}

Этому определили шаблон данных где-нибудь (App.xaml, Окно. Ресурсы, и т.д.):

<DataTemplate DataType="{x:Type l:ToolBarItem}">
    <Button Command="{Binding Command}">
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Image}"/>
            <TextBlock Text="{Binding Text}"/>
        </StackPanel>
    </Button>
</DataTemplate>

И затем используйте парня в своем xaml как это:

<Window ...>
    ...
    <ContentControl>
        <ContentControl.Content>
            <l:ToolBarItem Image="..." Command="..." Text="..."/>
        </ContentControl.Content>
    </ContentControl>
    ...
</Window>

Я просто не знаю, что способом, которым Вы пытаетесь сделать это, является большая часть способа WPF, которым Вы могли сделать это.

РЕДАКТИРОВАНИЕ, Обновленное на основе второго комментария Извините, я забыл включать ContentControl, окружающий это. Теперь, когда я помнил, что, понимаю, что это не является намного менее подробным, чем оригинал, где Вы указываете содержание вручную. Я отправлю новый ответ для помощи с исходным вопросом.

4
ответ дан 6 December 2019 в 21:20
поделиться

Повторно ответить на исходный вопрос:

То, что я думаю, что Вы хотите сделать, создают новый CustomControl по имени ImageButton. Затем измените его для расширения от Кнопки вместо Управления. Вам не будет нужно свойство Command, так как Кнопка уже имеет тот. Необходимо будет только добавить Свойство изображения, и можно снова использовать свойство Content от кнопки вместо того, чтобы иметь текстовое свойство.

Когда Ваш CustomControl будет создан, он добавит запись в Вашем Generic.xaml для стиля по умолчанию Вашего ImageButton. В Методе set для свойства Template можно изменить ControlTemplate на это:

<ControlTemplate TargetType="{x:Type local:ImageButton}">
    <StackPanel Orientation="Horizontal">
        <Image Source="{TemplateBinding Image}"/>
        <ContentPresenter/>
    </StackPanel>
</ControlTemplate>

Затем снова, когда Вы хотите использовать его:

<Window ... >
...
    <l:ImageButton Image="{StaticResource ...}" Command="...">
        Associer
    </l:ImageButton>
...
</Window>
1
ответ дан 6 December 2019 в 21:20
поделиться

Встроенная кнопка WPF содержит код, который запускает приложенную команду в ответ на то, чтобы быть нажатым. Ваш "ImageButton" происходит из UserControl, таким образом, Вы не получаете то поведение. Вероятно, краткий маршрут для получения, что Вы хотите, - чтобы Ваш класс ImageButton на самом деле произошел из класса Кнопки WPF. Для выполнения этого измените разметку для ImageButton от

<UserControl
...
>
...
</UserControl>

кому:

<Button
...
>
...
</Button>

Затем измените базовый класс ImageButton от UserControl кому: Button.

Необходимо будет, вероятно, внести некоторые другие незначительные изменения, прежде чем все это будет работать.

0
ответ дан 6 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: