Mariusz Nowak
Mariusz Nowak

Reputation: 11

wpf Usercontrol in usercontrol no response

I have a strange problem in my project. There are pages made from usercontrol and menu bar (also usercontrol).

Here is my usercontrol that contains few buttons

public partial class UpperBar : UserControl
{       
    public UpperBar()
    {
        InitializeComponent();
    }

    public event EventHandler EventbtClicked;
    private void btConnect_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        EventbtClicked(this, e);
    }    
}

I added this in my page as follows:

<local:UpperBar VerticalAlignment="Top" Grid.Row="0" Height="78" Grid.ColumnSpan="3" Margin="0,2,0,0"/>

And in my page tried to call event:

public PageStatus()
{
    InitializeComponent();
    Plc.ExecuteRefresh += new EventHandler(RefreshLeds);


   UpperBar.EventbtCliced += new EventHandler(UpperBatButtonClick);  
}

protected void UpperBarButtonClick(object sender, EventArgs e)
{
    //do something
}

But I can't access my event using this UpperBar.EventbtCliced, why ?

Upvotes: 0

Views: 170

Answers (2)

user2047950
user2047950

Reputation:

You should use Custom Command (RoutedUICommand) rather than bubbling event from user control.

here are some steps to follow in contrast to your approach:

1: create class myCustomCommand.

      namespace WpfApplication1

      {

         public  class myCustomCommand.
          {

               private static RoutedUICommand _luanchcommand;//mvvm

                 static myCustomCommand.()
                  {
               System.Windows.MessageBox.Show("from contructor"); // static consructor is                                                 called when static memeber is first accessed(non intanciated object)
       InputGestureCollection gesturecollection = new InputGestureCollection();
       gesturecollection.Add(new KeyGesture(Key.L,ModifierKeys.Control));//ctrl+L
       _luanchcommand =new RoutedUICommand("Launch","Launch",typeof(myCustomCommand.),gesturecollection);

   }
   public static  RoutedUICommand Launch
   {
       get
       {
           return _luanchcommand;
       }
   }

}

   }

In the xaml of UserControl:

                    <UserControl x:Class="WpfApplication1.UserControl1"

         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

          xmlns:CustomCommands="clr-namespace:WpfApplication1"

         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

                <UserControl.CommandBindings> 
              <CommandBinding Command="CustomCommands:myCustomCommand.Launch" Executed="CommandBinding_Executed">

    </CommandBinding>
</UserControl.CommandBindings>
<Grid >
    <TextBox  Name="mytxt"   Height="30" Width="60" Margin="50,50,50,50" ></TextBox>
    <Button Name="b" Height="30" Width="60" Margin="109,152,109,78" Command="CustomCommands:ZenabUICommand.Launch"></Button>

</Grid>

Now in User control code

Handle command_executed

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        mytxt.Text = "invoked on custom command";
    }
}

}

Upvotes: 0

Ouarzy
Ouarzy

Reputation: 3043

You need to access the instance of your class UpperBar in PageStatus, not the class UpperBar itself!

The easiest way for you here:

  • Name your UpperBar in your XAML, example:

<local:UpperBar x:Name="_myBar" x:FieldModifier="private"/>

  • Then use this instance in your PageStatus.xaml.cs:

    public partial class MainWindow : Window    {
    public MainWindow()
    {
        InitializeComponent();
    
        _myBar.EventbtClicked += new EventHandler(UpperBarButtonClick);
    }
    
    protected void UpperBarButtonClick(object sender, EventArgs e)
    {
        //do something
    }
    

    }

Now if you are working seriously in WPF, you should really learn about Databinding and MVVM, catching event this way is not the best way to do it at all.

Upvotes: 2

Related Questions