Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pressed Image Button 
:(
    Опции темы
HelloweenStranger
Дата 7.2.2012, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



Доброго времени суток всем!

Товарищи, вопрос в следующем! 
Необходимо создать пользовательский компонент, кнопку CustomButton, в котором в качестве фона служит картинка. При нажатии на кнопку картинка меняется на другую, символизирующую состояние Pressed. Этот компонент я хотел создать в отдельной сборке. 
ОЧЕНЬ ВАЖНО: путь к картинкам должен быть настраиваемым из кода, использующего данный компонент, то есть прописать в xaml-файле компонента что-то типа Source="Image1.png" совершенно не подходит!

В C# классе компонента хочу создать два строковых свойства отвечающие за картинки:

Код

    public class DKButton: Button
    {
        public DKButton()
        {
            DefaultStyleKey = typeof(DKButton);
        }

        public static readonly DependencyProperty UriNormalStateProperty =
            DependencyProperty.Register(
            "UriNormalState", typeof(String),
            typeof(DKButton), null
            );

        public String UriNormalState
        {
            get { return (String)GetValue(UriNormalStateProperty); }
            set { SetValue(UriNormalStateProperty, value); }
        }

        public static readonly DependencyProperty UriPressedStateProperty =
            DependencyProperty.Register(
            "UriPressedState", typeof(String),
            typeof(DKButton), null
            );

        public String UriPressedState
        {
            get { return (String)GetValue(UriPressedStateProperty); }
            set { SetValue(UriPressedStateProperty, value); }
        }

    }

А в xaml файле компонента каким-то образом описать поведение моего компонента в состояниях Pressed и Normal, чтобы это выглядело примерно так:

Код

<ControlTemplate TargetType="src:DKButton">
                    <Grid x:Name="RootElement">
                        <Image Name="backgroundImage" />
                        <vsm:VisualStateManager.VisualStateGroups>
                            <!--Define the states for the common states. The states in a 
                                        VisualStateGroup are mutually exclusive to each other.-->
                            <vsm:VisualStateGroup x:Name="CommonStates">
                                <!--Define the VisualStates in this VistualStateGroup.-->
                                <vsm:VisualState x:Name="Normal" backgroundImage.Source = UriNormalState/>
                                    button is pressed.-->
                                <vsm:VisualState x:Name="Pressed" backgroundImage.Source = UriPressedState />
                            </vsm:VisualStateGroup>
                        </vsm:VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>

Но вот каким образом мне это прописать в xaml файле я не имею представления, так как с Silverlight до настоящего момента был не знаком. Не могли бы подсказать?

PM MAIL   Вверх
KelTron
Дата 8.2.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



Этот класс я для себя писал, можешь взять..)

Реализация полностью в коде, настраиваются 3 свойства: NormalStateImage, HoverStateImage, PressedStateImage. Передаётся uri картинки.

Код

public class ImageButton : Button
    {
        #region Fields

        private event EventHandler<MouseButtonEventArgs> MouseDown;
        private event EventHandler<MouseButtonEventArgs> MouseUp;

        private Image _contentImage;
        private readonly Dictionary<string, BitmapImage> _stateBitmaps = new Dictionary<string, BitmapImage>();

        #endregion

        #region Dependency properties

        public string NormalStateImage
        {
            get { return (string)GetValue(NormalStateImageProperty); }
            set
            {
                SetValue(NormalStateImageProperty, value);
                SetImage(value);
            }
        }

        public static readonly DependencyProperty NormalStateImageProperty =
            DependencyProperty.Register("NormalStateImage", typeof(string), typeof(ImageButton), new PropertyMetadata(null));

        public string HoverStateImage
        {
            get { return (string)GetValue(HoverStateImageProperty); }
            set { SetValue(HoverStateImageProperty, value); }
        }

        public static readonly DependencyProperty HoverStateImageProperty =
            DependencyProperty.Register("HoverStateImage", typeof(string), typeof(ImageButton), new PropertyMetadata(null));

        public string PressedStateImage
        {
            get { return (string)GetValue(PressedStateImageProperty); }
            set { SetValue(PressedStateImageProperty, value); }
        }

        public static readonly DependencyProperty PressedStateImageProperty =
            DependencyProperty.Register("PressedStateImage", typeof(string), typeof(ImageButton), new PropertyMetadata(null));

        #endregion

        #region Ctor

        public ImageButton()
        {
            _contentImage = new Image();
            Content = _contentImage;
            Padding = new Thickness(0);
            BorderThickness = new Thickness(0);
            MouseDown += new EventHandler<MouseButtonEventArgs>(ButtonExt_MouseDown);
            MouseUp += new EventHandler<MouseButtonEventArgs>(ButtonExt_MouseUp);
            MouseEnter += new MouseEventHandler(ButtonExt_MouseEnter);
            MouseLeave += new MouseEventHandler(ButtonExt_MouseLeave);
        }

        #endregion

        #region Image states

        void ButtonExt_MouseLeave(object sender, MouseEventArgs e)
        {
            SetImage(NormalStateImage);
        }

        void ButtonExt_MouseEnter(object sender, MouseEventArgs e)
        {
            SetImage(HoverStateImage);
        }

        void ButtonExt_MouseUp(object sender, MouseButtonEventArgs e)
        {
            SetImage(HoverStateImage);
        }

        void ButtonExt_MouseDown(object sender, MouseButtonEventArgs e)
        {
            SetImage(PressedStateImage);
        }

        private void SetImage(string uri)
        {
            if (string.IsNullOrEmpty(uri))
            {
                return;
            }

            if (!_stateBitmaps.ContainsKey(uri))
            {
                _stateBitmaps[uri] = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
            }

            _contentImage.Source = _stateBitmaps[uri];
        }

        #endregion

        #region Base overrides

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            var handler = MouseDown;
            if (handler != null)
            {
                handler(this, e);
            }
        }

        protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonUp(e);

            var handler = MouseUp;
            if (handler != null)
            {
                handler(this, e);
            }
        }

        protected override void OnGotFocus(RoutedEventArgs e)
        {
            // do nothing in order to disable button focus
        }

        #endregion
    }



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0638 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.