2017-08-08 82 views
0

我正在WPF應用程序上工作,我想提高我在運行時爲按鈕創建的按鈕的點擊事件。我想按鈕點擊應該是動態的 例如:我有兩個按鈕一個是City1,一個是State1,兩個都有Click事件,我有另一個同名的City2和State2的Button。我想是我想提出City1點擊的事件和以及狀態1點擊 這裏是我的代碼:如何提高WPF中後臺代碼中按鈕的點擊事件

Button getSpecificButton = XYZ.Common.ExtensionMethods.FindLogicalChildren<Button>(this).Where(btn1 => btn1.Content == Intrbt.Content).FirstOrDefault(); 
if (getSpecificButton != null && getSpecificButton.Content != null) 
{ 
    //getSpecificButton.Name = getSpecificButton.Content.ToString(); 
    //getSpecificButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent)); 
} 

我有用於獲得應用程序的所有按鈕,我在這裏流汗外,這個擴展方法。

public static IEnumerable<T> FindLogicalChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      foreach (object rawChild in LogicalTreeHelper.GetChildren(depObj)) 
      { 
       if (rawChild is DependencyObject) 
       { 
        DependencyObject child = (DependencyObject)rawChild; 
        if (child is T) 
        { 
         yield return (T)child; 
        } 

        foreach (T childOfChild in FindLogicalChildren<T>(child)) 
        { 
         yield return childOfChild; 
        } 
       } 
      } 
     } 
    } 

但此代碼不工作請嘗試解決此問題。

+0

我會建議使用'ICommand'實現來綁定一個'Button.Command'屬性。然後,您不需要遍歷可視化樹並模擬點擊按鈕,而只需在後面的代碼中執行'ICommand',而無需訪問可視化樹。 – Adwaenyth

+0

我無法使用ICommand因爲有100個按鈕,我必須更改完整的代碼。所以請提供一個解決方案 –

+0

State1.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));雖然寫一個特定的名稱的按鈕,它的工作正常。但如果我assiging按鈕作爲getSpecificButton.RaiseEvent(新RoutedEventArgs(ButtonBase.ClickEvent));拋出異常。 –

回答

-1
getSpecificButton.Click += btn_Click; 

//separate method 
private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    // ... 
} 

這將工作。 但請使用ICommand作爲Adwaenyth的評論。

+0

這實際上不適用於我。因爲我不知道按鈕在運行時間點擊什麼按鈕來應該調用他們相關的引發點擊事件。例如,如果狀態點擊,然後state_click應該舉起,如果城市點擊,然後city_click應該提高,但同樣的方法,我可以通過其他方式或切換,但我有100個按鈕,我想要避免100開關或如果阻止這就是爲什麼我問 –