有没有办法从用户控件运行主代码?

时间:2013-03-20 16:01:47

标签: c# wpf

我有一个带按钮的用户控件(等等),但是我想点击它来在主窗口中创建该用户控件的另一个实例。

主:

UserControl mycontrol1= new UserControl();            
mainwin.Children.Add(mycontrol1); 

在mycontrol中有一个按钮点击我想创建另一个mycontrol2但这不起作用

UserControl mycontrol2= new UserControl();   
this.Parent.Children.Add(mycontrol2);
this.Parent.FunctionOfMainProgIWantToRUn();

我来自ActionScript世界,这将在那里运行,但WPF逻辑很难获得。

2 个答案:

答案 0 :(得分:0)

你真的这样做是错误的。 “正确”的方式是拥有一个公开集合的模型类。然后,您应该将集合绑定到ItemsControl(如列表视图),然后使用DataTemplate为列表中的每个项目创建UserControl并绑定它的属性。

MVVM模式非常值得学习,使WPF开发更容易管理,更易于维护。它看起来更像是前期工作,但从长远来看它确实值得。

答案 1 :(得分:0)

我可以解决您的问题的一种方法是:在Usercontrol中使用EvenHandler并在mainView中订阅它。在每个说按钮上单击Usercontrol引发事件。

我刚创建了一个示例:

我们在Usercontrol中有文本框和按钮

这是代码隐藏的;

    public partial class UserControl1 : UserControl
{
    public event EventHandler<EventArgs> CreateNewUserControl = null;
    public static int InstanceCount = 0;
    public UserControl1()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(UserControl1_Loaded);
    }

    void UserControl1_Loaded(object sender, RoutedEventArgs e)
    {
        InstanceCount++;
        txtControl.Text = "Control - " + InstanceCount;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var handler = CreateNewUserControl;
        if (handler != null)
         handler.Invoke(sender,e);
    }
}

在MainView中:

的Xaml:

   <StackPanel x:Name="UserControlTest" Orientation="Vertical" VerticalAlignment="Top" HorizontalAlignment="Right" Grid.Column="1" Grid.RowSpan="2" ScrollViewer.VerticalScrollBarVisibility="Auto" MaxHeight="800" Margin="30">

            <RadChartProject:UserControl1 x:Name="UserControl1"/>

        </StackPanel>

xaml.cs:

      public MainPage()
    {
        InitializeComponent();

        UserControl1.CreateNewUserControl += UserControl1_CreateNewUserControl;
    }

    void UserControl1_CreateNewUserControl(object sender, EventArgs e)
    {
        if(UserControlTest != null)
        {
            var control = new UserControl1();
            control.CreateNewUserControl += UserControl1_CreateNewUserControl;
            UserControlTest.Children.Add(control);
        }
    }