【问题标题】:How to Add Click_Events to buttons added a runtime in Generic.Xaml?如何将 Click_Events 添加到在 Generic.Xaml 中添加运行时的按钮?
【发布时间】:2014-01-22 10:18:53
【问题描述】:

正如问题所述,我希望将Click_Events 添加到Generic.Xaml 中的按钮中。

然而,这似乎不是每个人都在问的典型问题,因为它没有那么简单。我的按钮是在运行时生成的,所有 35 个按钮都在 Calender-Control 上。日历上的每一天(方形)都将是一个按钮,单击该按钮将打开一个弹出表单,显示完整日期和更多详细信息。

以下是日历控件的示例:

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_EventsClick_Events 用于使用 Generic.Xaml 页面生成的按钮。

【问题讨论】:

    标签: c# wpf xaml mouseclick-event generic.xaml


    【解决方案1】:

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

    您可以查看 MSDN 上的 How to: Find ControlTemplate-Generated Elements 页面,以帮助您从 ControlTemplate 访问 UI 元素。一旦您可以访问您的 UI 元素,我猜您将能够自行附加处理程序。

    【讨论】:

    • 感谢您的回复。当您说“使用FindName 方法从XAML 中查找控件” 时,由于它们是生成的按钮/控件并且没有设置名称,我该如何找到它们?除非我完全误解了你的意思。
    • Err... 也许给他们一个名字?:button.Name = "Button1";
    • 好的,谢谢,我想我明白了。我的通用页面上的 XAML 中的 Click_Event 会包含什么内容?
    • 首先,在 XAML 中声明一些没有处理程序的 UI 元素。然后您可以从ApplyTemplate 方法中引用它们并将任何处理程序附加到您想要的任何事件。就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2013-06-12
    • 2017-04-04
    • 2019-08-04
    相关资源
    最近更新 更多