Пользовательские расширения разметки возвращают RoutedEvents - PullRequest
0 голосов
/ 04 июля 2010

Я пытаюсь создать обобщенное событие для моих кнопок Закрыть, где они должны закрыть окно, но перед этим установить фокус на окно владельца. Я не хочу иметь событие для каждого файла для этого, потому что это было бы довольно непрактично, так как в моем приложении более 30 окон. (Поэтому, если бы я хотел изменить это поведение, мне нужно было бы каждый раз менять 30 файлов)

Я не уверен, что это правильный подход, но я попытался создать расширение MarkUp, которое возвращает delegate(object sender, RoutedEventArgs e) Вот код:

delegate void RoutedDelegate(object sender, RoutedEventArgs e);
[MarkupExtensionReturnType(typeof(RoutedEvent))]
public class CloseWindowExtension : MarkupExtension
{
    Window win = null;

    public Window Win
    {
        get { return this.win; }
        set { this.win = value; }
    }

    public CloseWindowExtension(Window win)
        : base()
    {
        this.win = win;
    }



    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (win == null)
        {
            throw new InvalidOperationException("The window must be specified!");
        }

        return new RoutedDelegate(delegate(object sender, RoutedEventArgs e)
        {
            Extensions.FocusClose(win);
        });
    }
}

Метод FocusClose возвращает окно, закрывает его, но предварительно устанавливает его владельца. Но я не могу заставить это работать. Когда я устанавливаю свою кнопку в xaml,

Button Click="{e:CloseWindow {Binding win}}"

(win - это имя моего окна), я получаю сообщение об ошибке:

Click = "{e: CloseWindow {Binding win}}" недействителен. «{e: CloseWindow {Binding win}}» не является допустимым именем метода обработчика событий. Допустимы только методы экземпляра в сгенерированном классе или классе с выделенным кодом. Строка 28, позиция 17.

Я что-то не так делаю? Это лучший подход или у меня есть другие варианты? Заранее спасибо!

Clark

Ответы [ 2 ]

1 голос
/ 05 июля 2010

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

См. эту статью Марлона Греча для деталей

0 голосов
/ 05 июля 2016

.NET 4.5+ поддерживает расширения разметки для событий, поэтому вы можете реализовать то, что хотели сейчас:)

...