Как добавить Click_Events к кнопкам, добавленным во время выполнения в Generic.Xaml?

Как говорится в вопросе, я хочу добавить Click_Events чтобы кнопки в Generic.Xaml,

Тем не менее, это не типичный вопрос, который, кажется, все задают, поскольку он не так прост. Мои кнопки генерируются во время выполнения, все 35 из них в Calender-Control. Каждый день (квадрат) в календаре будет представлять собой кнопку, которая при нажатии откроет всплывающую форму, отображающую полную дату и дополнительную информацию.

Вот пример элемента управления календаря:

Вот код XAML:

 <Button IsEnabled="{Binding IsEnabled}" Click="" BorderThickness="0" ScrollViewer.VerticalScrollBarVisibility="Auto" Background="{x:Null}" Foreground="White" Height="72" Width="131">
              <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                  <ContentPresenter
                   VerticalAlignment="Center"
                   HorizontalAlignment="Left">
                    <ContentPresenter.Content>
                     <Grid x:Name="ContentGrid" HorizontalAlignment="Left" >
                        <Grid.ColumnDefinitions>
                          <ColumnDefinition Width="15*" />
                            <ColumnDefinition Width="*" />
                              <ColumnDefinition Width="15*" />
                                </Grid.ColumnDefinitions>
                                  <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" FlowDirection="RightToLeft">
                                    <TextBlock Text="{Binding Date, Converter={StaticResource DateConverter}, ConverterParameter=DAY}"  Grid.Column="0" VerticalAlignment="Top" FontSize="14" Margin="5,5,5,5" FontWeight="Light" >
                                       <TextBlock.Style>
                                         <Style TargetType="{x:Type TextBlock}">
                                           <Style.Triggers>
                                             <DataTrigger Binding="{Binding IsTargetMonth}" Value="false">
                                               <Setter Property="TextBlock.Foreground" Value="Black"></Setter>
                                              </DataTrigger>
                                            </Style.Triggers>
                                          </Style>
                                        </TextBlock.Style>
                                       </TextBlock>
                                     </StackPanel>
                                       <TextBlock Text="{Binding Notes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" VerticalAlignment="Center" FontSize="14"/>
                                   </Grid>
                                 </ContentPresenter.Content>
                               </ContentPresenter>
                             </ControlTemplate>
                           </Button.Template>
                        </Button>

Как вы можете видеть из XAML, есть Click_Event доступно, но я не могу ссылаться на другую форму и не могу назвать кнопки, так как их будет несколько, так что прямого метода для ссылки на метод в классе нет. Кроме того, я пытался связать, но продолжает давать мне нулевую ошибку привязки.

На данный момент в классе Calendar у меня есть следующие методы:

public void BuildCalendar(DateTime targetDate)
    {
        Days.Clear();

        //Calculate when the first day of the month is and work out an 
        //offset so we can fill in any boxes before that.
        DateTime d = new DateTime(targetDate.Year, targetDate.Month, 1);
        int offset = DayOfWeekNumber(d.DayOfWeek);
       if (offset != 1) d = d.AddDays(-offset);

        //Show 5 weeks each with 7 days = 35
       for (int box = 1; box <= 35; box++)
       {
           Day day = new Day { Date = d, Enabled = true, IsTargetMonth = targetDate.Month == d.Month };
           day.PropertyChanged += Day_Changed;
           day.IsToday = d == DateTime.Today;
           Days.Add(day);
           d = d.AddDays(1);
       }
    }

И Day_Clicked метод, на который я не могу ссылаться (если это то, что мне нужно сделать):

 private void Day_Clicked(object sender, EventArgs e)
    {
        if (Clicked == null) return;

        Clicked(this, new DayClickedEventArgs(sender as Day));
    }

изготовленный на заказ EventHandler:

 public event EventHandler<DayClickedEventArgs> Clicked;

Класс события:

public class DayClickedEventArgs : EventArgs
{
    public Day Day { get; private set; }

    public DayClickedEventArgs(Day day)
    {
        this.Day = day;
    }
}

Подводя итог, мне нужно знать, как генерировать Click_Events для каждой сгенерированной кнопки в календаре. Click_Events для сгенерированных кнопок, использующих Generic.Xaml стр.

1 ответ

Решение

Вы должны подождать, пока элементы пользовательского интерфейса из ControlTemplate были созданы. Вы можете справиться с FrameworkElement.ApplyTemplate Метод для этого, как на данном этапе, шаблон... был применен. Затем вам нужно использовать FindName метод, чтобы найти элементы управления из XAML.

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

Другие вопросы по тегам