6

WPF アプリですべてのボタンのクリックを聞くにはどうすればよいですか。いくつかのチェックボックスなどを含めることもできますが、理想的には、余分なイベントハンドラーを持ちたくありません。

人々が私たちのアプリケーションをどのように使用しているかを知るために、初期統計を収集したいと考えています。他のイベント処理機能に干渉しないようにしたいと考えています。

アプリケーションでは、新しいウィンドウが独自のボタンで開閉されるため、静的に行うことはできません。

または、WPF アプリから使用統計を収集する一般的な方法はありますか。

4

5 に答える 5

7

WPF アプリですべてのボタンのクリックを聞くにはどうすればよいですか?

EventManagerを使用して、タイプのすべてのオブジェクトにイベントをフックできます。

EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(Button_Click));

private void Button_Click(object sender, RoutedEventArgs e)
{

}

アプリケーションでは、新しいウィンドウが独自のボタンで開閉されるため、静的に行うことはできません。

これらの Windows を WPF で作成すると、Closed、Sizechanged、Got/LostFocus() などのWindow イベントにフックできます。これらの Windows が WPF/Winform ベースでない場合は、ShellHookを使用できます

于 2013-07-18T12:47:46.277 に答える
2

スタイルを使用できます:

.xaml

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="Button">
                <EventSetter Event="Click" Handler="Button_Click" />
            </Style>
        </StackPanel.Resources>
        <Button x:Name="b1" Click="Button1_Click" Content="1" />
        <Button x:Name="b2" Click="Button2_Click" Content="2" />
        <Button Content="other" />
    </StackPanel>
</Window>

xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("some button");
    }

    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("button1");
    }

    private void Button2_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("button2");
    }
}

app.xaml に配置すると、スタイルをアプリケーション全体に適用できます。

于 2013-07-18T12:54:18.860 に答える
0

ボタン クリック イベント処理にはコマンドを使用する必要があります。すべてのウィンドウには CommandBinding インスタンスがあり、その Execute 処理メソッドで、現在のボタンの使用に関する情報を、結果を保持するクラスの静的シングルトン インスタンスに送信できます。コマンドと CommandBindings は必須ではありませんが、MVVM パターンを使用している場合は、それらを使用してみてください。また、静的シングルトンの代わりにカスタム サービスを使用します。

于 2013-07-18T12:45:23.180 に答える
0

各ウィンドウの Window_Loaded イベントを使用して、VisualTree を反復処理し、すべてのボタンを見つけて、追加のジェネリック ハンドラーを登録できます。

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //Capture all buttons of this form.
        findButtons(this);
    }

    public void findButtons(FrameworkElement parent)
    {
        int childCount = VisualTreeHelper.GetChildrenCount(parent);

        for(int i=0; i<childCount; i++){
            var child = VisualTreeHelper.GetChild(parent,i);

            if (child is Button){
                  ((Button)child).Click += All_Button_Click;
            }

            var frameworkElement = child as FrameworkElement;
            findButtons(frameworkElement);
        }
    }

    private void All_Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Generic Handler");
    }

すべてのボタンをそのままにして、独自のカスタム イベント ハンドラーを持つことができます。メインウィンドウでハンドラーを使用して、すべてのフォームなどをカバーすることもできます.

于 2013-07-18T13:37:56.733 に答える