C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: WPF C#ボタングラデーション変更につきまして


(過去ログ 109 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■64975 / inTopicNo.1)  WPF C#ボタングラデーション変更につきまして
  
□投稿者/ 福富雄介 (1回)-(2013/01/27(Sun) 23:27:24)

分類:[.NET 全般] 

WPF C#ボタングラデーション変更につきまして
いつもお世話になっております。

デザインの自由度からWPFにて開発することになったのですが、
開発経験があまりにも浅いため、初歩的なことで躓いております。
どうか有識者のかた、意見をお聞かせください。

○したいこと
Gridに2つのボタンを配置し、各ボタンを押すたびに、押したボタンの背景色を変更させたいというものです。3パターンの背景色を順番に変更させたいです。

○質問
私なりに一応は作成することができたのですが、データバインドも使用していないうえ
、効率的な記載でないとおもわれます。下記に添付しますので、どういった構成(クラス設計)がより望ましいのかご教授いただけますでしょうか。
また別に、グラデーションのデータバインドの方法もわかるかたがいましたらご教授いただけますでしょうか。何卒よろしくお願いいたします。

namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
//ボタンスタータス初期化
public int intButton1 = 1;
public int intButton2 = 1;

public LinearGradientBrush button1brush;
public LinearGradientBrush button2brush;
public MainWindow()
{
InitializeComponent();
//グラデーションインスタンス生成
button1brush = new LinearGradientBrush();
button2brush = new LinearGradientBrush();
//初期のグラデーション配色設定
button1brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
button1brush.GradientStops.Add(new GradientStop(Colors.Black, 1));

button2brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
button2brush.GradientStops.Add(new GradientStop(Colors.Black, 1));
//位置設定
button1brush.StartPoint = new Point(0.5, 0);
button1brush.EndPoint = new Point(0.5, 1);
button2brush.StartPoint = new Point(0.5, 0);
button2brush.EndPoint = new Point(0.5, 1);
//各ボタン背景に設定
button1.Background = button1brush;
button2.Background = button2brush;
}


private void button1_Click(object sender, RoutedEventArgs e)
{
//グラデーションクリア
button1brush.GradientStops.Clear();
switch (intButton1)
{

case 1:
//グラデーション設定
button1brush.GradientStops.Add(new GradientStop(Colors.Aqua, 0));
button1brush.GradientStops.Add(new GradientStop(Colors.White, 1));
intButton1 = 2;
break;
case 2:
//グラデーション設定
button1brush.GradientStops.Add(new GradientStop(Colors.Black, 0));
button1brush.GradientStops.Add(new GradientStop(Colors.CadetBlue, 1));
intButton1 = 3;

break;
case 3:
//グラデーション設定
button1brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
    button1brush.GradientStops.Add(new GradientStop(Colors.Black, 1));
intButton1 = 1;

break;
default:

break;
}
}


private void button2_Click_1(object sender, RoutedEventArgs e)
{
//グラデーションクリア
button2brush.GradientStops.Clear();
switch (intButton2)
{

case 1:
//グラデーション設定
button2brush.GradientStops.Add(new GradientStop(Colors.Aqua, 0));
button2brush.GradientStops.Add(new GradientStop(Colors.White, 1));
intButton2 = 2;
break;
case 2:
//グラデーション設定
button2brush.GradientStops.Add(new GradientStop(Colors.Black, 0));
button2brush.GradientStops.Add(new GradientStop(Colors.CadetBlue, 1));
intButton2 = 3;
break;
case 3:
//グラデーション設定
button2brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
    button2brush.GradientStops.Add(new GradientStop(Colors.Black, 1));

intButton2 = 1;

break;
default:
break;

引用返信 編集キー/
■65017 / inTopicNo.2)  Re[1]: WPF C#ボタングラデーション変更につきまして
□投稿者/ Jitta (23回)-(2013/01/29(Tue) 21:46:16)
Jitta さんの Web サイト
No64975 (福富雄介 さん) に返信
 C# はオブジェクト志向言語です。
 今書かれているコードは、「如何にして背景色を変更するか」という所に主眼が置かれています。つまり、「背景色を変更する」というプロセスに志向(考えを向ける)しています。そうではなく、「ボタン」というオブジェクトに、指向する(方向を向く)だけでなく、志向しましょう。
 そうすると、ボタンという部品に「クリックされると背景色が変わる」という機能を追加する、というところに行き着かないでしょうか。

引用返信 編集キー/
■65024 / inTopicNo.3)  Re[1]: WPF C#ボタングラデーション変更につきまして
□投稿者/ shu (160回)-(2013/01/30(Wed) 10:00:13)
2013/01/30(Wed) 10:00:27 編集(投稿者)
No64975 (福富雄介 さん) に返信

button1brush.GradientStops.Clear();
button1brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
button1brush.GradientStops.Add(new GradientStop(Colors.Black, 1));
という組み合わせが頻繁に出てきます。
この中で各場所で異なる部分を例えばA, B, Cとすると
A.GradientStops.Clear();
A.GradientStops.Add(new GradientStop(B, 0))
A.GradientStops.Add(new GradientStop(C, 1))
となります。

これを関数化すると
private void SetGradient(LinearGradientBrush A, Color B, Color C)
{
    A.GradientStops.Clear();
    A.GradientStops.Add(new GradientStop(B, 0))
    A.GradientStops.Add(new GradientStop(C, 1))
}
となります。

元のソースの該当部分をこの関数呼び出しに置き換えると
以下のようになります。これで少しはすっきりします。上記関数の
定義は適当に記述する必要があります。

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        //ボタンスタータス初期化
        public int intButton1 = 1;
        public int intButton2 = 1;

        public LinearGradientBrush button1brush;
        public LinearGradientBrush button2brush;
        public MainWindow()
        {
            InitializeComponent();
            //グラデーションインスタンス生成
            button1brush = new LinearGradientBrush();
            button2brush = new LinearGradientBrush();
            //初期のグラデーション配色設定
            SetGradient(button1brush, Colors.Red, Colors.Black);
            SetGradient(button2brush, Colors.Red, Colors.Black);
            〜
        }


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            switch (intButton1)
            {

                case 1:
                    //グラデーション設定
                    SetGradient(button1brush, Colors.Aqua, Colors.White);
                    intButton1 = 2;
                    break;
                case 2:
                    //グラデーション設定
                    SetGradient(button1brush, Colors.Black, Colors.CadetBlue);
                    intButton1 = 3;

                    break;
                case 3:
                    //グラデーション設定
                    SetGradient(button1brush, Colors.Red, Colors.Black);
                    intButton1 = 1;

                    break;
                default:

                    break;
            }
        }


    private void button2_Click_1(object sender, RoutedEventArgs e)
    {
        switch (intButton2)
        {
            case 1:
                //グラデーション設定
                SetGradient(button2brush, Colors.Aqua, Colors.White);
                intButton2 = 2;
                break;
            case 2:
                //グラデーション設定
                SetGradient(button2brush, Colors.Black, Colors.CadetBlue);
                intButton2 = 3;
                break;
            case 3:
                //グラデーション設定
                SetGradient(button2brush, Colors.Red, Colors.Black);
                intButton2 = 1;

                break;
            default:
                break;
    }
}

引用返信 編集キー/
■65026 / inTopicNo.4)  Re[2]: WPF C#ボタングラデーション変更につきまして
□投稿者/ shu (161回)-(2013/01/30(Wed) 10:26:39)
2013/01/30(Wed) 10:26:53 編集(投稿者)
No65024 (shu さん) に返信

Iteratorを用いた例:
public partial class MainWindow : Window
{
	public LinearGradientBrush button1brush;
	public LinearGradientBrush button2brush;
	public IEnumerator<int> EnumButton1;
	public IEnumerator<int> EnumButton2;

	public MainWindow()
	{
		InitializeComponent();
		button1brush = new LinearGradientBrush();
		button2brush = new LinearGradientBrush();
		button1.Background = button1brush;
		button2.Background = button2brush;

		EnumButton1 = SetGradient(button1brush).GetEnumerator();
		EnumButton2 = SetGradient(button2brush).GetEnumerator();

		EnumButton1.MoveNext();
		EnumButton2.MoveNext();

	}

	private IEnumerable<int> SetGradient(LinearGradientBrush brs)
	{
		Color[][] colarray = new Color[][] {new Color[] {Colors.Red,Colors.Black}
						,new Color[] {Colors.Aqua, Colors.White}
						,new Color[] {Colors.Black, Colors.CadetBlue}};
		while (true)
		{
			foreach(Color[] cols in colarray)
			{
				brs.GradientStops.Clear();
				brs.GradientStops.Add(new GradientStop(cols[0], 0));
				brs.GradientStops.Add(new GradientStop(cols[1], 1));
				yield return 0;
			}
		}
	}

	private void button1_Click(object sender, RoutedEventArgs e)
	{
		EnumButton1.MoveNext();
	}

	private void button2_Click(object sender, RoutedEventArgs e)
	{
		EnumButton2.MoveNext();
	}
}

引用返信 編集キー/
■65083 / inTopicNo.5)  Re[3]: WPF C#ボタングラデーション変更につきまして
□投稿者/ 福富雄介 (3回)-(2013/02/02(Sat) 22:10:40)
皆様ありがとうございました。
やはりコードビハインドはよくないと思い
データバインドの方法を研究中です。
No65026 (shu さん) に返信
> 2013/01/30(Wed) 10:26:53 編集(投稿者)
>
> ■No65024 (shu さん) に返信
>
> Iteratorを用いた例:
> public partial class MainWindow : Window
> {
> public LinearGradientBrush button1brush;
> public LinearGradientBrush button2brush;
> public IEnumerator<int> EnumButton1;
> public IEnumerator<int> EnumButton2;
>
> public MainWindow()
> {
> InitializeComponent();
> button1brush = new LinearGradientBrush();
> button2brush = new LinearGradientBrush();
> button1.Background = button1brush;
> button2.Background = button2brush;
>
> EnumButton1 = SetGradient(button1brush).GetEnumerator();
> EnumButton2 = SetGradient(button2brush).GetEnumerator();
>
> EnumButton1.MoveNext();
> EnumButton2.MoveNext();
>
> }
>
> private IEnumerable<int> SetGradient(LinearGradientBrush brs)
> {
> Color[][] colarray = new Color[][] {new Color[] {Colors.Red,Colors.Black}
> ,new Color[] {Colors.Aqua, Colors.White}
> ,new Color[] {Colors.Black, Colors.CadetBlue}};
> while (true)
> {
> foreach(Color[] cols in colarray)
> {
> brs.GradientStops.Clear();
> brs.GradientStops.Add(new GradientStop(cols[0], 0));
> brs.GradientStops.Add(new GradientStop(cols[1], 1));
> yield return 0;
> }
> }
> }
>
> private void button1_Click(object sender, RoutedEventArgs e)
> {
> EnumButton1.MoveNext();
> }
>
> private void button2_Click(object sender, RoutedEventArgs e)
> {
> EnumButton2.MoveNext();
> }
> }
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -