2014-01-22 40 views
0

正如问题所述,我正在寻找将Click_Events添加到Generic.Xaml中的按钮。如何将Click_Events添加到按钮在Generic.Xaml中添加了运行时?

但是,这不是每个人似乎都在问的典型问题,因为它不那么简单。我的按钮在运行时生成,全部35个按钮都在日历控件上。日历上的每一天(Square)将会是一个按钮,单击它时会打开一个弹出窗体,显示完整日期和更多详细信息。

这里是日历控件的一个例子:

http://i.stack.imgur.com/il1V6.jpg

这里是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页面生成的按钮。

回答

0

您必须等到创建了ControlTemplate的UI元素。您可以在此阶段处理FrameworkElement.ApplyTemplate Method,因为该模板已被应用。然后您需要使用FindName方法来查找XAML中的控件。

您可以查看MSDN上的How to: Find ControlTemplate-Generated Elements页面,以帮助您访问ControlTemplate中的UI元素。一旦你有权访问你的UI元素,我猜你可以自己附加处理程序。

+0

感谢您的回复。当你说_“使用FindName'方法从XAML查找控件”_,由于它们是生成的按钮/控件,并且没有设置名称,我怎么能找到它们?除非我完全误解你的观点。 – EliotE123

+0

错误...也许给他们一个名字?:'button.Name =“Button1”;' – Sheridan

+0

好吧,谢谢,我想我明白。那么我的通用页面上的XAML中的'Click_Event'会怎么样? – EliotE123