Статическая функция как обработчик событий в xaml - PullRequest
5 голосов
/ 10 ноября 2011

Я использую этот код для имитации функциональности вкладок в моем приложении silverlight.

Я бы действительно хотел избегать написания этой функции много раз, потому что она должна использоваться для большого количества текстовых полей в приложении. Я создал статический класс

public static class TabInsert
{
    private const string Tab = "    ";
    public static void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (e.Key == Key.Tab)
        {
            int selectionStart = textBox.SelectionStart;
            textBox.Text = String.Format("{0}{1}{2}",
                    textBox.Text.Substring(0, textBox.SelectionStart),
                    Tab,
                    textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength, (textBox.Text.Length) - (textBox.SelectionStart + textBox.SelectionLength))
                    );
            e.Handled = true;
            textBox.SelectionStart = selectionStart + Tab.Length;
        }
    } 
}

чтобы я мог получить к нему доступ из разных мест, вот так textBox.KeyDown += TabInsert.textBox_KeyDown;

Есть ли способ сделать это в XAML?

Ответы [ 2 ]

6 голосов
/ 10 ноября 2011

К сожалению, нет прямого способа сделать это в XAML . Обработчики событий, которые вы пишете в коде, должны быть методами экземпляра и не могут быть статическими методами. Эти методы должны быть определены частичным классом в пространстве имен CLR, обозначенном x: Class. Вы не можете указать имя обработчика событий, чтобы дать указание процессору XAML искать обработчик событий для проводки событий в другой области видимости.

5 голосов
/ 10 ноября 2011

Вы можете создать Поведение (пространство имен System.Windows.Interactivity), которое будет легко прикрепляться к текстовым полям, которые в переопределении OnAttached () подписываются на событие и выполняют обработку, как вы, и отписываются в OnDetaching ().

Что-то вроде:

public class TabInsertBehavior : Behavior<TextBox>
{
    /// <summary>
    /// Called after the behavior is attached to an AssociatedObject.
    /// </summary>
    /// <remarks>
    /// Override this to hook up functionality to the AssociatedObject.
    /// </remarks>
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.KeyDown += textBox_KeyDown;
    }

    private const string Tab = "    ";
    public static void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (e.Key == Key.Tab)
        {
            int selectionStart = textBox.SelectionStart;
            textBox.Text = String.Format("{0}{1}{2}",
                    textBox.Text.Substring(0, textBox.SelectionStart),
                    Tab,
                    textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength, (textBox.Text.Length) - (textBox.SelectionStart + textBox.SelectionLength))
                    );
            e.Handled = true;
            textBox.SelectionStart = selectionStart + Tab.Length;
        }
    } 

    /// <summary>
    /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred.
    /// </summary>
    /// <remarks>
    /// Override this to unhook functionality from the AssociatedObject.
    /// </remarks>
    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.KeyDown -= textBox_KeyDown;
    }
}
...