【问题标题】:How to detect events from an added template user control inside main form如何从主窗体内添加的模板用户控件中检测事件
【发布时间】:2014-06-02 23:38:49
【问题描述】:

拥有一个用户控件模板SubCtrl,它在构造函数上获取一个id 设置标签CounterLabelText 并包含:

1 个复选框
1 个按钮
1 RadNumeric

<Grid Height="27" Width="602">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="533*" />
            <ColumnDefinition Width="44*" />
        </Grid.ColumnDefinitions>
        <Label                          Margin="26,0,492,0" Content="{Binding CounterLabelText}" />
        <CheckBox                       Height="16" HorizontalAlignment="Left" Margin="7,5,0,0"     Name="ChkBxOrder"              Width="21" VerticalAlignment="Top"  telerik:StyleManager.Theme="Vista" IsManipulationEnabled="True" />
        <!--<telerik:RadButton          Height="22" HorizontalAlignment="Left" Margin="343,1,0,0"   Name="ButtonDoSomething"       Width="58" VerticalAlignment="Top"  telerik:StyleManager.Theme="Vista" Content="Set Points" Click="ButtonDoSomething_Click" />-->
        <telerik:RadNumericUpDown       Height="18" HorizontalAlignment="Left" Margin="412,1,0,0"   Name="radx"                    Width="40" VerticalAlignment="Top"  IsInteger="True" telerik:StyleManager.Theme="Vista"/>
    </Grid>




public partial class SubCtrl : UserControl
{
    private string _counterLabelText;
    public string CounterLabelText
    {
        get
        {
            return _counterLabelText;
        }
        set
        {
            _counterLabelText = value;
            OnPropertyChanged("CounterLabelText");
        }
    }

    public SubCtrl(int id)
    {
        InitializeComponent();
        CounterLabelText = id.ToString();
        DataContext = this;
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}

由于用户控件是在主窗体内的ADD button 上动态创建的,因此传递了一个计数器,例如

public partial class MainCtrl : UserControl
{
    int templateRowsCounter;

    //constructor and variables
    //...
    //...
    private void AddTemplate_Click(object sender, RoutedEventArgs e)
    {
        StackRefinement.Children.Add(new SubCtrl (++templateRowsCounter));
    }

    private void DelTemplate_Click(object sender, RoutedEventArgs e)
    {
        //how to remove it based on templateRowsCounter ???
    }

}

我有两个问题

  1. 如何使用 DelTemplate_Click() 添加删除最后添加的模板?
  2. SubCtrl 带有一个复选框、一个按钮和一个 radNumeric 我怎么知道何时必须调用 ButtonDoSomething_Click() 方法 当按下ButtonDoSomething时,以及如何获取复选框和RadNumeric的状态,我的意思是如何检测事件?

【问题讨论】:

  • 您尝试ButtonBase.Click 参加活动了吗? DelTemplate_Click 上应该删除哪个控件?第一,最后还是有任何选择?
  • 我想删除上次添加的模板,您能否举例说明如何在这种情况下为事件应用ButtonBase.Click
  • 我添加了问题 1 的答案,第二个我需要一些时间来准备

标签: c# wpf xaml telerik


【解决方案1】:

更新

SubCtrl 类

  • 我添加了一个事件 ButtonDoSomethingClicked
  • 为 ButtonDoSomething.Click 添加了事件处理程序
  • 在事件处理程序中调用 ButtonDoSomethingClicked

此外,当我将 UserControl 作为基类时,我更喜欢使用 DependencyProperty 而不是 INotifyPropertyChanged,因此也修改了 CounterLabelText

public partial class SubCtrl : UserControl
{
    public event EventHandler ButtonDoSomethingClicked;

    public string CounterLabelText
    {
        get { return (string)GetValue(CounterLabelTextProperty); }
        set { SetValue(CounterLabelTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for CounterLabelText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty CounterLabelTextProperty =
        DependencyProperty.Register("CounterLabelText", typeof(string), typeof(SubCtrl), new PropertyMetadata(null));


    public SubCtrl(int id)
    {
        InitializeComponent();
        CounterLabelText = id.ToString();
        DataContext = this;
        ButtonDoSomething.Click += ButtonDoSomething_Click;
    }

    void ButtonDoSomething_Click(object sender, RoutedEventArgs e)
    {
        ButtonDoSomethingClicked.Invoke(this, EventArgs.Empty);
    }
}

MainCtrl 的代码

  • 为 ButtonDoSomethingClicked 添加了事件处理程序
  • 更新为使用 templateRowsCounter 进行删除。

类代码

public partial class MainCtrl : UserControl
{
    int templateRowsCounter;

    private void AddTemplate_Click(object sender, RoutedEventArgs e)
    {
        SubCtrl sub = new SubCtrl(++templateRowsCounter);
        sub.ButtonDoSomethingClicked += sub_ButtonDoSomethingClicked;
        StackRefinement.Children.Add(sub);
    }

    private void DelTemplate_Click(object sender, RoutedEventArgs e)
    {
        SubCtrl sub = (SubCtrl)StackRefinement.Children[--templateRowsCounter];
        sub.ButtonDoSomethingClicked -= sub_ButtonDoSomethingClicked;
        StackRefinement.Children.Remove(sub);
    }

    void sub_ButtonDoSomethingClicked(object sender, EventArgs e)
    {
        //your do something logic
    }
}

所以这个示例传播了 ButtonDoSomethingClicked,rest 也可以以相同的方式实现。 ButtonBase.Click 在你不能修改代码的时候也很有用,也是比较通用的方法。

上一个

这是问题 1 的快速解决方案

private void DelTemplate_Click(object sender, RoutedEventArgs e)
{
    //remove last added template, advisable to check if exists before deleting it
    StackRefinement.Children.RemoveAt(StackRefinement.Children.Count - 1);
}

【讨论】:

  • 我可以做些什么来获取或覆盖复选框、按钮和 rad 数字上的更改属性?
  • 给我一些时间,我会带着第二部分的样本回来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多