Как добавить 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. Как только вы получите доступ к вашим элементам пользовательского интерфейса, я предполагаю, что вы сможете прикреплять обработчики самостоятельно.