Dynamically add Button to a Grid and add Action listener


   
  
<Window x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="DynamicXAML" Height="300" Width="300">
  <Grid Name="grid1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Window>
//File:Window.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Markup;
using System.Xml;
using System.IO;

namespace WpfApplication1
{

  public partial class Window1 : System.Windows.Window
  {

    public Window1()
    {
      InitializeComponent();

      StringReader sr = new StringReader(@"<Button xmlns=&#039;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#039; 
        Foreground=&#039;BurlyWood&#039; FontSize=&#039;20pt&#039;>Click Me!</Button>");

      XmlReader reader = XmlReader.Create(sr);

      Button dynamicButton = (Button)XamlReader.Load(reader);

      this.grid1.Children.Add(dynamicButton);

      dynamicButton.Click += button1_Click;
   
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      MessageBox.Show("Dynamic Button Loaded From XAML String");
    }

  }
}

   
    
     


Button click action


   
  

<Window x:Class="EightBall.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Eight Ball Answer" Height="328" Width="412" >
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.Background>
      <LinearGradientBrush>
        <LinearGradientBrush.GradientStops>
          <GradientStop Offset="0.00"  Color="Red" />
          <GradientStop Offset="0.50" Color="Indigo" />
          <GradientStop Offset="1.00" Color="Violet" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Grid.Background>
    <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10,10,13,10" Name="txtQuestion" 
             TextWrapping="Wrap" FontFamily="Verdana" FontSize="24"
             Grid.Row="0" >
      [Place question here.]
    </TextBox>
    <Button VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,20" Width="127" Height="23" Name="cmdAnswer"
            Click="cmdAnswer_Click" 
            Grid.Row="1">      
      Ask the Eight Ball
      </Button>
    <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10,10,13,10" Name="txtAnswer" 
             TextWrapping="Wrap" IsReadOnly="True" FontFamily="Verdana" FontSize="24" Foreground="Green"
             Grid.Row="2">
      [Answer will appear here.]
    </TextBox>    
  </Grid>
</Window>

//File:Window.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Input;

namespace EightBall
{
    public partial class Window1 : Window
    {

        public Window1()
        {
            InitializeComponent();
        }

        private void cmdAnswer_Click(object sender, RoutedEventArgs e)
        {           
            this.Cursor = Cursors.Wait;
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));

            txtAnswer.Text = "asdf";
            this.Cursor = null;
        }

    }
}

   
    
     


Button PreviewMouseDown action and MouseDown action


   
  
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="AddHandler" Height="300" Width="300">
  <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    <Button PreviewMouseDown="PreviewMouseDownButton" MouseDown="MouseDownButton">

      <Grid >
        <Grid.ColumnDefinitions>
          <ColumnDefinition />
          <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Canvas Width="20" Height="18" VerticalAlignment="Center">

          <Ellipse x:Name="myEllipse" Canvas.Left="1" Canvas.Top="1" Width="16" Height="16"
                   Fill="Yellow" Stroke="Black" />
        </Canvas>

      </Grid>
    </Button>
  </Grid>
</Window>
//File:Window.xaml.cs


using System;
using System.Windows;
using System.Diagnostics;
using System.Windows.Shapes;
using System.Windows.Input;

namespace WpfApplication1
{
    public partial class Window1 : System.Windows.Window
    {
        public Window1()
        {
            InitializeComponent();

        }
       
        void PreviewMouseDownButton(object sender, RoutedEventArgs e){ 
            Debug.WriteLine("PreviewMouseDownButton"); 
        }
 
        void MouseDownButton(object sender, RoutedEventArgs e){ 
            Debug.WriteLine("MouseDownButton"); 
        }


    }
}

   
    
     


Button PreviewMouseLeftButtonDown action and MouseLeftButtonDown action


   
  

<Window x:Class="TunnelingBubbling.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TunnelingBubbling">
  
    <Grid MouseLeftButtonDown="MouseDownGrid"
          PreviewMouseLeftButtonDown="PreviewMouseDownGrid"
      Width="300" Height="300">

    <Button PreviewMouseLeftButtonDown="PreviewMouseDownButton"
      MouseLeftButtonDown="MouseDownButton"
      Click="MyClickEvent"
      Name="btnGo">

      <TextBox MouseLeftButtonDown="MouseLeftButtonDown"
        PreviewMouseLeftButtonDown="PreviewMouseLeftButtonDown"
        Width="200" Height="30" Name="textBox1">
      </TextBox>
    </Button>
  </Grid>  
</Window>
//File:Window.xaml.cs

using System;
using System.Collections.Generic;
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;
using System.Diagnostics;

namespace TunnelingBubbling
{
    public partial class Window1 : System.Windows.Window
    {

        public Window1()
        {
            InitializeComponent();
        }

        private void PreviewMouseDownGrid(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("PreviewMouseDownGrid");
        }

        private void PreviewMouseDownButton(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("PreviewMouseDownButton");
        }

        private void PreviewMouseLeftButtonDown(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("PreviewMouseLeftButtonDown");
        }

        private void MyClickEvent(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("MyClickEvent");
        }

        private void MouseLeftButtonDown(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("MouseLeftButtonDown");
        }

        private void MouseDownButton(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("MouseDownButton");
        }

        private void MouseDownGrid(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("MouseDownGrid");
        }

    }
}

   
    
     


Nested Button content


   
  
<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WpfApplication1" Height="300" Width="300" WindowStartupLocation="CenterScreen">
  <StackPanel>
    <Button Name="btnClickMe" Height="75" Width = "250" Click ="btnClickMe_Clicked">
      <StackPanel Orientation ="Horizontal">
        <Label Height="50" FontSize ="20">Fancy Button!</Label>
        <Canvas Height ="50" Width ="100" >
          <Ellipse Name = "outerEllipse" Fill ="Green" Height ="25" 
                   MouseDown ="outerEllipse_MouseDown"
                   PreviewMouseDown ="outerEllipse_PreviewMouseDown"
                   Width ="50" Cursor="Hand" Canvas.Left="25" Canvas.Top="12"/>
          <Ellipse Name = "innerEllipse" Fill ="Yellow" Height = "15" Width ="36"
                        Canvas.Top="17" Canvas.Left="32"/>
        </Canvas>
      </StackPanel>
    </Button>
  </StackPanel>
</Window>
//File:Window.xaml.cs

using System;
using System.Collections.Generic;
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 WpfApplication1
{
  public partial class MainWindow : System.Windows.Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    public void btnClickMe_Clicked(object sender, RoutedEventArgs e)
    {
      Console.WriteLine("Button Click event fired!");
    }

    public void outerEllipse_MouseDown(object sender, RoutedEventArgs e)
    {
      Console.WriteLine("MouseDown event fired!");
      e.Handled = false;
    }

    public void outerEllipse_PreviewMouseDown(object sender, RoutedEventArgs e)
    {
      Console.WriteLine("PreviewMouseDown event fired!");
      e.Handled = false;
    }
  }
}

   
    
     


Load style defined in Xaml and apply to the Button


   
  

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WpfApplication1" Height="231" Width="544" WindowStartupLocation="CenterScreen">
  <Window.Resources>
    <Style x:Key ="TiltStyle" TargetType = "{x:Type Button}">
      <Setter Property = "RenderTransform">
        <Setter.Value>
          <RotateTransform Angle = "30"/>
        </Setter.Value>
      </Setter>
    </Style>
    <Style x:Key ="GreenStyle" TargetType = "{x:Type Button}">
      <Setter Property = "Background" Value ="Green"/>
      <Setter Property = "Foreground" Value ="Yellow"/>
      <Setter Property ="FontSize" Value ="15" />
    </Style>
    <Style x:Key ="MouseOverStyle" BasedOn ="{StaticResource GreenStyle}" TargetType = "{x:Type Button}">
      <Style.Triggers>
        <Trigger Property ="IsMouseOver" Value ="True">
          <Setter Property ="FontSize" Value ="20" />
          <Setter Property ="Foreground" Value ="Black" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </Window.Resources>

  <StackPanel>
    <ListBox Name ="lstStyles" Height ="60" Background = "Yellow"
        SelectionChanged ="comboStyles_Changed" />
    <Button Name="btnMouseOverStyle" Grid.Column="1"
      Height="40" Width="100" Click ="btnMouseOverStyle_Click">My Button</Button>
  </StackPanel>
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
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 WpfApplication1
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();

      lstStyles.Items.Add("TiltStyle");
      lstStyles.Items.Add("GreenStyle");
      lstStyles.Items.Add("MouseOverStyle");
    }

    protected void comboStyles_Changed(object sender, RoutedEventArgs args)
    {
      System.Windows.Style currStyle = (System.Windows.Style)FindResource(lstStyles.SelectedValue);
      this.btnMouseOverStyle.Style = currStyle;
    }

    protected void btnMouseOverStyle_Click(object sender, RoutedEventArgs args)
    {
      MessageBox.Show("Clicked");
    }
  }
}

   
    
     


A simple template for a round button


   
  
      
<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ControlTemplates" Height="300" Width="300" WindowStartupLocation="CenterScreen">
    <Window.Resources>
    <Style x:Key ="roundButtonTemplate" TargetType ="{x:Type Button}">
      <Setter Property ="Foreground" Value ="Black"/>
      <Setter Property ="FontWeight" Value ="Bold"/>
      <Setter Property ="Template">
      <Setter.Value>
        <ControlTemplate TargetType ="{x:Type Button}">
          <Grid>
            <Ellipse Name ="OuterRing" Width ="75" Height ="75" Fill ="DarkGreen"/>
            <Ellipse Name ="InnerRing" Width ="60" Height ="60" Fill ="MintCream"/>
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
          </Grid>
          <ControlTemplate.Triggers>
            <Trigger Property ="IsMouseOver" Value ="True">
              <Setter TargetName ="OuterRing" Property ="Fill" Value ="MediumSeaGreen"/>
            </Trigger>
            <Trigger Property ="IsPressed" Value ="True">
              <Setter TargetName ="OuterRing" Property ="Height" Value ="90"/>
              <Setter TargetName ="OuterRing" Property ="Width" Value ="90"/>
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
      </Style>
  </Window.Resources>
    <Button Name ="myButton"
      Style ="{StaticResource roundButtonTemplate}"
      Click ="myButton_Click">
      Click!
    </Button>
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
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 WpfApplication1
{
  public partial class MainWindow : System.Windows.Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }
    protected void myButton_Click(object sender, RoutedEventArgs args)
    {
      MessageBox.Show("Clicked!");
    }
  }
}