2011-01-19 14 views
12

WPF में यह कोड क्यों काम नहीं करता है?बटन 1.PerformClick() wpf

private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("yes"); 
    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     button1.PerformClick(); 
    } 

मैं आदेश की जरूरत है।

उत्तर

1

क्योंकि PerformClick WindowsForms बटन नियंत्रण पर एक विधि है:

http://msdn.microsoft.com/en-us/library/system.windows.controls.button_methods.aspx

किसी बटन को क्लिक को स्वचालित करने के लिए आपको लेने के लिए पसंद कर सकते हैं:

http://msdn.microsoft.com/en-us/library/system.windows.forms.button.performclick.aspx

नहीं WPF बटन नियंत्रण पर

यूआई स्वचालन ढांचे पर एक नज़र:

http://msdn.microsoft.com/en-us/library/ms747327.aspx

3

डब्ल्यूपीएफ में अच्छा अभ्यास कमांड का उपयोग कर रहा है। यह टेस्टेबिलिटी में सुधार करता है और यूआई और बिजनेस लॉजिक को अलग करता है।

सबसे पहले आप RoutedUICommand आज़मा सकते हैं।

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:self ="clr-namespace:Test" 
    Title="MainWindow" 
    Height="350" Width="525"> 
<Window.CommandBindings> 
    <CommandBinding Command="{x:Static self:MainWindow.RoutedClickCommand}" 
        CanExecute="CommandBinding_CanExecute" 
        Executed="CommandBinding_Executed"/> 
</Window.CommandBindings> 
<Grid> 
    <Button Content="Test" Name="Btn1" Command="{x:Static self:MainWindow.RoutedClickCommand}"/> 
</Grid> 

कोड में फ़ाइल के पीछे हम RoutedClickCommand को परिभाषित करने और निष्पादित करने के लिए है | CanExecute संचालकों:

public static ICommand RoutedClickCommand = new RoutedUICommand("ClickCommand", "ClickCommand", typeof(MainWindow)); 

    private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     MessageBox.Show("ololo"); 
    } 

तो, आप बटन तर्क (जरूरत है जब; में "button1.PerformClick()" आपका नमूना), बस अगली पंक्ति डालें:

MainWindow.RoutedClickCommand.Execute(null); 

मेरे लिए, मैं एक और तरीका मानता हूं जो मानता है प्रस्तुति मॉडल में ले जाने की आज्ञा। समग्र अनुप्रयोग लाइब्रेरी (प्रिज्म) मुझे अपने प्रतिनिधि कॉमांड क्लास के साथ मदद करता है। फिर कमान की तरह प्रस्तुति मॉडल में परिभाषा दिखता है:

private DelegateCommand<object> _clickCommand; 

    public ICommand ClickCommand 
    { 
     get 
     { 
      if (this._clickCommand == null) 
      { 
       this._clickCommand = new DelegateCommand<object>(p => 
        { 
         //command logic 
        }, 
        p => 
        { 
         // can execute command logic 
        }); 
      } 
      return this._clickCommand; 
     } 
    } 

और दृश्य XAML और कोड के पीछे:

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:self ="clr-namespace:Test" 
    Title="MainWindow" 
    Height="350" Width="525"> 
<Grid> 
    <Button Content="Test" Name="Btn1" Command="{Binding ClickCommand}"/> 
</Grid> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.Model = new SampleModel(); 
    } 

    protected SampleModel Model 
    { 
     get 
     { 
      if (this.Model.ClickCommand.CanExecute()) 
      { 
       this.Model.ClickCommand.Execute(); 
      } 
      return (SampleModel)this.DataContext; 
     } 
     set 
     { 
      this.DataContext = value; 
     } 
    } 
} 

अगला कोड बटन पर क्लिक दृश्य दरकिनार में आदेश कहता है:

if (this.Model.ClickCommand.CanExecute()) 
{ 
this.Model.ClickCommand.Execute(); 
} 
22
namespace System.Windows.Controls 
{ 
    public static class MyExt 
    { 
     public static void PerformClick(this Button btn) 
     { 
      btn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
     } 
    } 
} 

अब आप किसी भी बटन के लिए उपयोग कर सकते हैं एक बटन "btnOK" कहा जाता है यह सोचते हैं:

btnOK.PerformClick(); 
8

प्रतीक्षाखिड़कियों प्रपत्र अनुप्रयोग की शैली का उपयोग करने के लिए, आप निम्नलिखित विस्तार विधि लिखने की ज़रूरत .. एक आसान तरीका है।यदि आपके बटन नाम Button1 और क्लिक Button1 पहले ही सदस्यता घटना, तो आप सिर्फ

button1_Click(this,null); 
4
के बजाय

की तरह है कि घटना कॉल करेंगे PerformClick() उपयोग RaiseEvent()

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("yes"); 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    RoutedEventArgs newEventArgs = new RoutedEventArgs(Button.ClickEvent); 
    button1.RaiseEvent(newEventArgs);   
} 
3

एक है Adam NathansWPF Unleashed से उद्धरण, blog द्वारा अनुशंसित।
इम्हो सर्वश्रेष्ठ में से एक है, अगर सबसे अच्छा WPF संदर्भ नहीं है।

var bap = new System.Windows.Automation.Peers.ButtonAutomationPeer(someButton); 
var iip = bap.GetPattern(System.Windows.Automation.Peers.PatternInterface.Invoke) 
          as System.Windows.Automation.Provider.IInvokeProvider; 
iip.Invoke(); 
+0

धन्यवाद सैम काम करना चाहिए! इसके अलावा, दूसरों के लिए आपको UIAutomationProvider को अपने प्रोजेक्ट – Rob

+0

के संदर्भ के रूप में जोड़ा जाना चाहिए, धन्यवाद, यह मेरे लिए काम करता है, जहां अन्य समाधान नहीं थे (उदा। यह.someButton.RaiseEvent (नया रूटेड एवेन्ट आर्ट्स (बटन। MouseEnterEvent));) –

2

मुझे लगता है कि आपकी समस्या का सबसे छोटा और सबसे प्रभावी समाधान बस एक पंक्ति में किया जाएगा।

button1.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 

कि के लिए WPF सी #