1

C# コードを作成して、3 つのイメージ (1 つのベース イメージと 2 つのオーバーレイ) と 3 つのテキスト ボックスをボタンの表面として持つ ImageButton (以下) を作成しました。私は Button クラスから継承していますが、残念ながら、コーディング後まで表示されず、削除する必要があるとは認識していなかったコンポーネントがいくつか含まれています。最終的に wrapPanel になり、境界線はシームレスである必要があります。C# でフォーマットが完成したので、必要な機能を得るために ControlTemplate を作成できるように XAML に変換する必要があると思いますが、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; }
        }
    }
4

2 に答える 2

1

いくつかの新しい機能でボタンを拡張しようとしているようです。そのため、最初に依存関係システムを利用して、プロパティを XAML でバインドできるようにする必要があります。新しい依存関係プロパティの宣言については、MSDNのこの記事を参照してください。

依存関係プロパティの最有力候補は Image プロパティです。

実際、ビジュアル スタジオで新しい CustomControl テンプレートを使用して定型コードを提供することをお勧めします。ボイラープレートの一部は、コントロールの既定のテンプレートを提供する themes.xaml ファイルを宣言しています。そのテンプレートは、コントロール用に翻訳された XAML を保持するものです。

XAML の良いところは、初期化言語であることです。AlbumCover で宣言された依存関係プロパティを取得したら、コントロールのテンプレートでそれらにバインドします。この仕組みの詳細については、Charles Petzold のWPF でのルックレス コントロールの作成に関する記事を参照してください。

コントロールの基本的な外観と機能が整っています。これら 2 つのリソースに従うと、WPF エコシステム内で統合するのに役立ちます。

于 2010-03-29T02:03:20.627 に答える
1

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 構文を確認することから始めるとよいでしょう。

于 2010-03-28T21:28:23.980 に答える