朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
WPF XAMLとコードの差をみる





ここでは、XAMLとコードでのボタンの形状を変えたい場合の差を見て、みなさんがどちらのコードでも作成できるようになるための参考になればなと思います。
やっていることは、ボタンの形状を二重丸に変えて、塗りつぶしています。

Window1.xaml

    <window x:class="CustomButtonProject.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        title="Window1" height="300" width="300" loaded="Window_Loaded">
        <grid>
            <button height="50" horizontalalignment="Left" margin="45,96,0,0" name="button1" verticalalignment="Top" width="50" click="button1_Click">Button</button>
            </grid>
    </window>

Window1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections;
namespace CustomButtonProject
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ResourceDictionary rd = new ResourceDictionary();
            foreach (DictionaryEntry t in this.Resources)
            {
                rd[t.Key] = t.Value;
            }
            ResourceDictionary theme = Application.LoadComponent(new Uri("CustomButton.xaml", UriKind.Relative)) as ResourceDictionary;
            rd.MergedDictionaries.Add(theme);
            this.Resources = rd;
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Window2 w = new Window2();
            w.ShowDialog();
        }
    }
}

CustomButton.xaml

    <resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <style x:key="{x:Type Button}" targettype="{x:Type Button}">
    <Setter Property="Template" > <Setter.Value > <ControlTemplate TargetType="{x:Type Button}" > <Grid Width="50" Height="50" > <Ellipse Fill="Black" StrokeThickness="2" Stroke="Aqua" / > <Ellipse Fill="Green" StrokeThickness="1" Stroke="Blue" Width="10" Height="10" / > </Grid > </ControlTemplate > </Setter.Value > </Setter > 
        </style>
    </resourcedictionary>

Window2.xaml

    <window x:class="CustomButtonProject.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        title="Window2" height="300" width="300">
        <grid name="rootGrid" loaded="Grid_Loaded">
        
            </grid>
    </window>

Window2.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace CustomButtonProject
{
    /// <summary>
    /// Window2.xaml の相互作用ロジック
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();
        }
        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            ControlTemplate template = new ControlTemplate(typeof(Button));
            FrameworkElementFactory elem1 = new FrameworkElementFactory(typeof(Grid));
            FrameworkElementFactory ell1 = new FrameworkElementFactory(typeof(Ellipse));
            ell1.SetValue(WidthProperty, Convert.ToDouble(50));
            ell1.SetValue(HeightProperty, Convert.ToDouble(50));
            ell1.SetValue(Path.FillProperty, Brushes.Red);
            ell1.SetValue(Path.StrokeThicknessProperty, Convert.ToDouble(2));
            ell1.SetValue(Path.StrokeProperty, Brushes.Red);
            FrameworkElementFactory ell2 = new FrameworkElementFactory(typeof(Ellipse));
            ell2.SetValue(WidthProperty, Convert.ToDouble(10));
            ell2.SetValue(HeightProperty, Convert.ToDouble(10));
            ell2.SetValue(Path.StrokeThicknessProperty, Convert.ToDouble(1));
            ell2.SetValue(Path.StrokeProperty, Brushes.Black);
            ell2.SetValue(Path.FillProperty, Brushes.Plum);        
            elem1.AppendChild(ell1);
            elem1.AppendChild(ell2);
            template.VisualTree = elem1;
            Button btn = new Button();
            btn.Click += new RoutedEventHandler(button1_Click);
            btn.Template = template;
            this.rootGrid.Children.Add(btn);
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("クリックされました。");
            
        }
    }
}








良いやや良い普通やや悪い悪い

投稿日時評価コメント