Перевести ImageButton с C # на XAML - PullRequest
1 голос
/ 29 марта 2010

Я разработал код C # для создания кнопки ImageButton (ниже), которая имеет три изображения (одно базовое изображение и два наложения) и три текстовых поля в качестве лица кнопки. Я унаследован от класса Button, который, к сожалению, включает в себя несколько компонентов, которые я не осознавал, появится до тех пор, пока не будет написано код, и их нужно удалить, а именно ярко-синюю границу на IsMouseOver и любые видимые границы между кнопками в качестве кнопок закончится в WrapPanel и границы должны быть бесшовными. Теперь, когда формат был разработан в C #, я ожидаю, что мне нужно будет перевести на XAML, чтобы я мог создать ControlTemplate для получения необходимой функциональности, однако я не уверен относительно процесса перевода из C # в XAML. Я был бы признателен, если бы кто-нибудь знал о хорошем обзоре / ресурсе, в котором обсуждается, что потребуется для преобразования, чтобы я мог перевести соответствующим образом? Спасибо.

public class ACover : Button
    {
        Image cAImage = null;
        Image jCImage = null;
        Image jCImageOverlay = null;
        TextBlock ATextBlock = null;
        TextBlock AbTextBlock = null;
        TextBlock RDTextBlock = null;
        private string _TracksXML = "";

        public ACover() 
        {
            Grid cArtGrid = new Grid();

            cArtGrid.Background = new SolidColorBrush(Color.FromRgb(38, 44, 64));
            cArtGrid.Margin = new System.Windows.Thickness(5, 10, 5, 10);
            RowDefinition row1 = new RowDefinition();
            row1.Height = new GridLength(225); 
            RowDefinition row2 = new RowDefinition();
            row2.Height = new GridLength(0, GridUnitType.Auto);
            RowDefinition row3 = new RowDefinition();
            row3.Height = new GridLength(0, GridUnitType.Auto);
            RowDefinition row4 = new RowDefinition();
            row4.Height = new GridLength(0, GridUnitType.Auto);
            cArtGrid.RowDefinitions.Add(row1);
            cArtGrid.RowDefinitions.Add(row2);
            cArtGrid.RowDefinitions.Add(row3);
            cArtGrid.RowDefinitions.Add(row4);

            ColumnDefinition col1 = new ColumnDefinition();
            col1.Width = new GridLength(0, GridUnitType.Auto);
            cArtGrid.ColumnDefinitions.Add(col1);

            jCImage = new Image();
            jCImage.Height = 240;
            jCImage.Width = 260;
            jCImage.VerticalAlignment = VerticalAlignment.Top;
            jCImage.Source = new BitmapImage(new Uri(Properties.Settings.Default.pathToGridImages + "jc.png", UriKind.Absolute));
            cArtGrid.Children.Add(jCImage);

            cArtImage = new Image();
            cArtImage.Height = 192;
            cArtImage.Width = 192;
            cArtImage.Margin = new System.Windows.Thickness(3, 7, 0, 0);
            cArtImage.VerticalAlignment = VerticalAlignment.Top;
            cArtGrid.Children.Add(cArtImage);

            jCImageOverlay = new Image();
            jCImageOverlay.Height = 192;
            jCImageOverlay.Width = 192;
            jCImageOverlay.Margin = new System.Windows.Thickness(3, 7, 0, 0);
            jCImageOverlay.VerticalAlignment = VerticalAlignment.Top;
            jCImageOverlay.Source = new BitmapImage(new Uri( Properties.Settings.Default.pathToGridImages + "jc-overlay.png", UriKind.Absolute));
            cArtGrid.Children.Add(jCImageOverlay);

            ATextBlock = new TextBlock();
            ATextBlock.Foreground = new SolidColorBrush(Color.FromRgb(173, 176, 198));
            ATextBlock.Margin = new Thickness(10, -10, 0, 0);
            cArtGrid.Children.Add(ATextBlock);

            AlTextBlock = new TextBlock();
            AlTextBlock.Margin = new Thickness(10, 0, 0, 0);
            AlTextBlock.Foreground = new SolidColorBrush(Color.FromRgb(173, 176, 198));
            cArtGrid.Children.Add(AlTextBlock);

            RDTextBlock = new TextBlock();
            RDTextBlock.Margin = new Thickness(10, 0, 0, 0);
            RDTextBlock.Foreground = new SolidColorBrush(Color.FromRgb(173, 176, 198));
            cArtGrid.Children.Add(RDTextBlock);

            Grid.SetColumn(jCImage, 0);
            Grid.SetRow(jCImage, 0);
            Grid.SetColumn(jCImageOverlay, 0);
            Grid.SetRow(jCImageOverlay, 0);
            Grid.SetColumn(cArtImage, 0);
            Grid.SetRow(cArtImage, 0);

            Grid.SetColumn(ATextBlock, 0);
            Grid.SetRow(ATextBlock, 1);
            Grid.SetColumn(AlTextBlock, 0);
            Grid.SetRow(AlTextBlock, 2);
            Grid.SetColumn(RDTextBlock, 0);
            Grid.SetRow(RDTextBlock, 3);
            this.Content = cArtGrid;
        }

        public string A
        {
            get { if (ATextBlock != null) return ATextBlock.Text;
                else return String.Empty; }
            set { if (ATextBlock != null) ATextBlock.Text = value; }
        }

        public string Al
        {
            get { if (AlTextBlock != null) return AlTextBlock.Text;
                  else return String.Empty; }
            set { if (AlTextBlock != null) AlTextBlock.Text = value; }
        }

        public string RD
        {
            get { if (RDTextBlock != null) return RDTextBlock.Text;
                  else return String.Empty; }
            set { if (RDTextBlock != null) RDTextBlock.Text = value; }
        }

        public ImageSource Image
        {
            get { if (cArtImage != null) return cArtImage.Source;
                  else return null; }
            set { if (cArtImage != null) cArtImage.Source = value; }
        }

        public string TracksXML
        {
            get { return _TracksXML; }
            set { _TracksXML = value; }
        }

        public double ImageWidth
        {
            get { if (cArtImage != null) return cArtImage.Width;
                  else return double.NaN;  }
            set { if (cArtImage != null) cArtImage.Width = value; }
        }

        public double ImageHeight
        {
            get { if (cArtImage != null) return cArtImage.Height;
                  else return double.NaN;  }
            set { if (cArtImage != null) cArtImage.Height = value; }
        }
    }

Ответы [ 2 ]

1 голос
/ 29 марта 2010

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

Первым кандидатом на свойство зависимости будет свойство Image.

На самом деле, я рекомендую использовать новый шаблон CustomControl в visual studio для предоставления вам стандартного кода. Часть шаблона - объявление файла themes.xaml, который предоставляет шаблон по умолчанию для вашего элемента управления. Именно этот шаблон будет держать ваш переведенный XAML для вашего контроля.

Преимущество XAML в том, что это язык инициализации. Как только вы получите свойства зависимостей, объявленные на вашем AlbumCover, вы привязываетесь к ним в шаблоне для вашего элемента управления. Подробнее о том, как это работает, читайте в статье Чарльза Петцольда о создании элементов управления без вида в WPF .

У вас есть базовый вид и функциональность для управления. Следование этим двум ресурсам должно помочь вам интегрироваться в экосистему WPF.

1 голос
/ 29 марта 2010

XAML в основном представляет граф объектов, поэтому перевод обычно должен быть довольно механическим:

  • C # new преобразуется в тег элемента XAML, например, Grid cArtGrid = new Grid(); переводится как <Grid Name="cArtGrid"></Grid>.
  • Установщики свойств C # преобразуются в атрибуты, если значение простое, например cArtGrid.Background = new SolidColorBrush(Color.FromRgb(38, 44, 64)); переводится как <Grid Background="#FF262C40">.
  • Если значение свойства является сложным, вам необходимо использовать синтаксис элемента свойства XAML.
  • Для добавления в коллекции обычно требуется синтаксис элемента свойства XAML, например, <Grid><Grid.RowDefinitions><RowDefinition Height="225" /></Grid.RowDefinitions></Grid>.
  • Но для коллекции Children вы можете просто поместить элемент прямо внутри, например. cArtGrid.Children.Add(jCImage); становится <Grid><Image ... /></Grid>. (То же самое относится и к свойству Content, хотя это не повлияет на вас.)
  • Прикрепленное свойство Вызовы SetXxx переводятся в атрибуты с точечной нотацией, например, Grid.SetColumn(ATextBlock, 0); становится <Grid><TextBlock Grid.Column="0" /></Grid>.
  • Вам необходимо понять, как представлены такие значения, как цвета и толщины, например. нотация #AARRGGBB для цветов и нотация CSV для толщин. MSDN обычно показывает это для соответствующих типов или свойств, которые имеют эти типы.

В общем, поиск свойства в MSDN и синтаксис XAML должен дать вам хорошее начало.

...