silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在silverlight中为模板化控件添加事件?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Bounty奖励任何有关使用模板化控件连接事件的可靠教程/学习资源. 我有一个像这样的控件模板: <Style TargetType="local:DatePicker"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:DatePicker
Bounty奖励任何有关使用模板化控件连接事件的可靠教程/学习资源.

我有一个像这样的控件模板:

<Style TargetType="local:DatePicker">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:DatePicker">
                <Border BACkground="{TemplateBinding BACkgrounD}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}" x:Name="myDatePickerContentArea">
                    <StackPanel Orientation="Vertical">
                        <Button x:Name="myTESTButton" Content="Test button"  />
                        <telerik:radDatePicker Style="{Staticresource VisitsReportTextBoxStylE}" Foreground="#FFFFFF"  x:Name="startDate" datetiR_48_11845@eWatermarkContent="Start Date"/>
                        <telerik:radDatePicker Style="{Staticresource VisitsReportTextBoxStylE}"  x:Name="endDate" datetiR_48_11845@eWatermarkContent="End Date"/>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

此模板的C#是:

public class DatePicker : Control 
{

    public static readonly DependencyProperty StartDateSELEctedDateProperty = DependencyProperty.Register("StartDateSELEctedDateProperty",typeof(datetiR_48_11845@E),typeof(DatePicker),null);
    public datetiR_48_11845@e? StartDateSELEctedDate { get; set; }


    public DatePicker()
    {
        this.DefaultStyleKey = typeof(DatePicker);            

    }



    public override void OnApplyTemplate()
    {
        RadDatePicker StartDate = this.GetTemplateChild("startDate") as RadDatePicker;
        StartDate.SELEctionChanged += new Telerik.Windows.Controls.SELEctionChangedEventHandler(StartDate_SELEctionChanged);
        StartDate.SELEctedDate = new datetiR_48_11845@e(2010,01,01);            
        base.onApplyTemplate();          
    }

    void StartDate_SELEctionChanged(object sender,Telerik.Windows.Controls.SELEctionChangedEventArgs E)
    {
        RadDatePicker temp = (RadDatePicker)sender;
        StartDateSELEctedDate = temp.SELEctedDate;
    }


}

我的选择改变事件不起火,我不知道为什么.
有任何想法吗 ?

解决方法

下面是一个使用最佳实践的示例,我认为您正在尝试构建这种控件(请参阅最后的注释以获得一些解释): –

[TemplatePart(Name = DatePicker.ElementStartDate,Type = typeof(RadDatePicker))]
[TemplatePart(Name = DatePicker.ElementEndDate,Type = typeof(RadDatePicker))]
public class DatePicker : Control  
{ 
    public DatePicker() 
    { 
        this.DefaultStyleKey = typeof(DatePicker);             
    } 


    #region Template Part Names
    private const String ElementStartDate = "startDate";
    private const String ElementEndDate = "endDate";
    #endregion

    #region Template Parts
    private RadDatePicker _StartDate;

    internal RadDatePicker StartDate
    {
        get { return _StartDate; }
        private set 
        {
            if (_StartDate != null)
            {
                _StartDate.SELEctionChanged -= StartDate_SELEctionChanged;
            }

            _StartDate = value;

            if (_StartDate != null)
            {
                _StartDate.SELEctionChanged += StartDate_SELEctionChanged;
            }
        }
    }

    private RadDatePicker _EndDate;

    internal RadDatePicker EndDate
    {
        get { return _EndDate; }
        private set 
        {
            if (_EndDate!= null)
            {
                _EndDate.SELEctionChanged -= EndDate_SELEctionChanged;
            }

            _EndDate= value;

            if (_EndDate!= null)
            {
                _EndDate.SELEctionChanged += EndDate_SELEctionChanged;
            }
        }
    }

    #endregion

    public static readonly DependencyProperty StartDateSELEctedDateProperty =
        DependencyProperty.Register(
            "StartDateSELEctedDateProperty",typeof(datetiR_48_11845@e?),new PropertyMetaData(new datetiR_48_11845@e(2010,01)));

    public datetiR_48_11845@e? StartDateSELEctedDate
    {
        get { return (datetiR_48_11845@e?)GetValue(StartDateSELEctedDateProperty); }
        set { SETVALue(StartDateSELEctedDateProperty)} 
    }

    public static readonly DependencyProperty EndDateSELEctedDateProperty =
        DependencyProperty.Register(
            "EndDateSELEctedDateProperty",01)));

    public datetiR_48_11845@e? EndDateSELEctedDate 
    {
        get { return (datetiR_48_11845@e?)GetValue(EndDateSELEctedDateProperty); }
        set { SETVALue(EndDateSELEctedDateProperty)} 
    }

    public override void OnApplyTemplate() 
    { 
        base.onApplyTemplate();           

        StartDate = GetTemplateChild(ElementStartDatE) as RadDatePicker; 
        EndDate =  GetTemplateChild(ElementEndDatE) as RadDatePicker; 
    } 

    void StartDate_SELEctionChanged(object sender,Telerik.Windows.Controls.SELEctionChangedEventArgs E) 
    { 
        // Do stuff with StartDate here
    } 

    void EndDate_SELEctionChanged(object sender,Telerik.Windows.Controls.SELEctionChangedEventArgs E) 
    { 
        // Do stuff with EndDate here
    }     
}

模板Xaml应如下所示: –

<Style TargetType="local:DatePicker">                                 
    <Setter Property="Template">                                 
        <Setter.Value>                                 
            <ControlTemplate TargetType="local:DatePicker">                                 
                <Border BACkground="{TemplateBinding BACkgrounD}"                                 
                        BorderBrush="{TemplateBinding BorderBrush}"                                 
                        BorderThickness="{TemplateBinding BorderThickness}" x:Name="myDatePickerContentArea">                                 
                    <StackPanel Orientation="Vertical">                                 
                        <Button x:Name="myTESTButton" Content="Test button"  />                                 
                        <telerik:radDatePicker x:Name="startDate"
                            Style="{Staticresource VisitsReportTextBoxStylE}"
                            Foreground="#FFFFFF"
                            datetiR_48_11845@eWatermarkContent="Start Date"
                            SELEctedDate="{TemplateBinding StartDateSELEctedDatE}"
                         />                                 
                        <telerik:radDatePicker x:Name="endDate"
                            Style="{Staticresource VisitsReportTextBoxStylE}"
                            datetiR_48_11845@eWatermarkContent="End Date"
                            SELEctedDate="{TemplateBinding EndDateSELEctedDatE}"
                        />                                 
                    </StackPanel>                                 
                </Border>                                 
            </ControlTemplate>                                 
        </Setter.Value>                                 
    </Setter>                                 
</Style>

一些解释

>您的原始代码一个关键问题是它没有正确实现依赖项属性.请注意,属性现在使用GetValue和SETVALue,并且属性元数据用于分配认值而不是尝试在onapplytemplate中设置.>在正确实现属性的情况下,模板绑定应该可以正常工作,实际上我们已经完成了看似你原来的意图,因此我在事件处理程序中遗漏了任何实际的代码.>在代码中创建常量以保存要与之交互的关键模板部件的名称,这样可以降低名称更改的成本.>将TemplatePart属性添加到类中,以指示代码期望找到的关键元素,它们的名称应该是什么以及它们应具有的基本类型.这允许设计者重新模板化现有控件,只要声明的模板部件存在,控件应该正确地运行,即使其UI被彻底改变.>如果需要为某些元素附加事件处理程序,请创建一个字段来保存对该元素的引用,然后创建一个包围它的属性.然后,属性设置器应该分离并附加事件处理程序,如代码中所示.>确保在OnApplyTemplate的覆盖中调用bae.onApplyTemplate,然后您可以看到它非常直接地分配上面创建的属性.>我没有RadDatePicker所以我无法测试,我唯一关注的是datetiR_48_11845@e在哪里?是SELEctedDate属性的正确类型.当然,如果它是对微软产品的改进,似乎已经在这个典型的数据输入要求上放弃了.

大佬总结

以上是大佬教程为你收集整理的如何在silverlight中为模板化控件添加事件?全部内容,希望文章能够帮你解决如何在silverlight中为模板化控件添加事件?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。