2011-01-25 4 views
1

У меня FlowDocument, который имеет некоторые элементы, как так:WPF XAML Кнопка Нажмите обработчик в задаче InlineUIContainer

<InlineUIContainer> 
    <Button Click="Button_Click" Tag="123456789890"> 
     <Image Source="Images\Image1.png" /> 
    </Button> 
</InlineUIContainer> 

Это хранится прочь в .xaml файл и будет загружаться в какой-то момент, делая что-то вроде так:

flowDocument = XamlReader.Load(xamlFile, parserContext) as FlowDocument; 
flowDocumentReader.Document = flowDocument; 

нагрузка не может со следующей ошибкой:

XamlParseException - Не удалось создать 'Клик' из текста 'Button_Click'

Метод Button_Click - это тот, который существует в MainWindow, в котором находится FlowDocumentReader, и идея состоит в том, что тег кнопки имеет некоторый идентификатор (идентификатор инвентаря), и обработчик клика сделает что-то с этим идентификатором инвентаря.

Если FlowDocument находится в MainWindow.xaml, все в порядке с этим обработчиком событий Button_Click, но я подозреваю, что когда он загружает файл с диска, он ничего не знает о обработчике.

Как я могу это решить? Идеи?


Update

В то время как я думаю, решение Павло был бы работать, я в конечном итоге делает следующее, и это, кажется, работает достаточно хорошо. В моем FlowDocumentReader Xaml я добавил следующее:

<FlowDocumentReader ButtonBase.Click="Button_Click"> 

и удалить событие щелчка из XAML для кнопок. Я по-прежнему сталкиваюсь с WPF и XAML, но этот общий обработчик кликов работает, я считаю, из-за перенаправленных событий. Когда Click происходит для любой из кнопок в моем загруженном FlowDocument, он пузырится до тех пор, пока не найдет обработчик, в моем случае тот, который указан в элементе FlowDocumentReader.

Несмотря на разочарование, которое у меня возникло из-за непонимания, он опрятен тем, что он работает таким образом.


Update 2:

Побочный эффект, опираясь на маршрутизировать события для обработки события нажатия на кнопки моего FlowDocument является то, что кнопки, которые являются частью FlowDocumentReader сам в конечном итоге барботирование их клики в этот обработчик catch-all, который я создал, что определенно не то, что я хочу.

Чтобы решить эту проблему, я в настоящее время, опираясь на тот факт, что в обработчике, который выглядит так:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (e.Source is Button) 
    { 
     MessageBox.Show("Button in doc clicked"); 
    } 
} 

член «Источник» в RoutedEventArgs является «Button» для кнопок в FlowDocument и «FlowDocumentReader» для тех, которые являются частью FlowDocumentReader. Появляется, чтобы работать, хотя мне было бы интересно услышать другие идеи.

ответ

2

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

<InlineUIContainer> 
    <Button x:Name="MyButton" Tag="123456789890"> 
     <Image Source="Images\Image1.png" /> 
    </Button> 
</InlineUIContainer> 

-

flowDocument = XamlReader.Load(xamlFile, parserContext) as FlowDocument; 
flowDocumentReader.Document = flowDocument; 

Button myButton = (Button)flowDocument.FindName("MyButton"); 
myButton.Click = Button_Click; 

Если кнопка не является уникальным, и вы не можете дать ему имя рассмотреть нахождение всех объектов типа Button в документе, которые имеют Tag набор свойств к ID.

+0

Я думаю, что ваше решение будет работать. См. Обновление моего вопроса о том, что я сделал, чтобы решить эту проблему. – itsmatt

0

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

Объявите новое событие в вашей кнопке классе

Public Shared ReadOnly ButtonClickEvent As RoutedEvent = _ 
       EventManager.RegisterRoutedEvent("ButtonClick", RoutingStrategy.Bubble, _ 
       GetType(RoutedEventHandler), GetType(MyButton)) 

' Provide CLR accessors for the event 
Public Custom Event ButtonClick As RoutedEventHandler 
    AddHandler(ByVal value As RoutedEventHandler) 
     Me.AddHandler(ButtonClickEvent, value) 
    End AddHandler 

    RemoveHandler(ByVal value As RoutedEventHandler) 
     Me.RemoveHandler(ButtonClickEvent, value) 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs) 
     Me.RaiseEvent(e) 
    End RaiseEvent 
End Event 

В храповом обработчик пользовательском классе кнопки поднять новую RoutedEvent

Private Sub MyButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) 
     RaiseEvent ButtonClick(Me, New RoutedEventArgs(MyButton.ButtonClickEvent)) 
    End Sub 

Слушающуюся для этого с обработчиком события в FlowDocumentReader или другого элемента верхнего уровня. (У меня есть GroupBox вокруг моего средства просмотра документа потока и добавили обработчик на этом уровне)

<GroupBox Header="Document editor" local:MyButton.ButtonClick="OnButtonClick" > 
Смежные вопросы