Im trying to create a button from code behind that has the same attributes as this:
<Button Content="Find Student" Tag="FindStudent" HorizontalAlignment="Right" x:Name="btnFindStudent" Click="btnGeneral_Click" />
Code behind:
Button btnFindStudent = new Button();
btnFindStudent.Click += this.btnGeneral_Click;
btnFindStudent.Name = Convert.ToString("btnFindStudent");
btnFindStudent.Tag = Convert.ToString("FindStudent");
btnFindStudent.Content = Convert.ToString("View");
btnFindStudent.HorizontalAlignment = HorizontalAlignment.Right;
btnFindStudent.Height = 20;
btnFindStudent.Width = 36;
The problem is when I click the button I get an error
Value cannot be null.
Parameter name: Children of 'System.Windows.Controls.UIElementCollection' cannot be null. Object derived from UIElement expected.
And im not quite sure whats missing, this is the full code:
public partial class FindStudent : UserControl
{
private Dictionary<string, UserControl> _userControls = new Dictionary<string, UserControl>();
public Dictionary<string, UserControl> GetUserControls()
{
return _userControls;
}
private static readonly Random rand = new Random();
public FindStudent()
{
InitializeComponent();
List<string> userControlKeys = new List<string>();
userControlKeys.Add("FindStudent");
Type type = this.GetType();
Assembly assembly = type.Assembly;
foreach (string userControlKey in userControlKeys)
{
string userControlFullName = String.Format("{0}.AppPages.{1}", type.Namespace, userControlKey);
UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName);
_userControls.Add(userControlKey, userControl);
}
for (int i = 1; i <= 10; i++)
{
Button btnFindStudent = new Button();
btnFindStudent.Click += this.btnGeneral_Click;
btnFindStudent.Name = Convert.ToString("btnFindStudent");
btnFindStudent.Tag = Convert.ToString("FindStudent");
btnFindStudent.Content = Convert.ToString("View {0}", i);
btnFindStudent.HorizontalAlignment = HorizontalAlignment.Right;
btnFindStudent.Height = 20;
btnFindStudent.Width = 36;
StackPanel stackPanel = new StackPanel();
stackPanel.Children.Add(btnFindStudent);
MainArea.Children.Add(stackPanel);
}
}
private void btnGeneral_Click(object sender, RoutedEventArgs e)
{
PanelMainContent.Children.Clear();
Button button = (Button)e.OriginalSource;
Type type = this.GetType();
Assembly assembly = type.Assembly;
PanelMainContent.Children.Add(_userControls[button.Tag.ToString()]);
// error on above line.
}
}
Xaml:
<UserControl x:Class="WpfApplication4.AppPages.FindStudent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<DockPanel HorizontalAlignment="Stretch" >
<ScrollViewer VerticalScrollBarVisibility="Hidden">
<DockPanel x:Name="PanelMainWrapper" Margin="10,20,0,0">
<DockPanel x:Name="PanelMainContent" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="0,30,0,0">
<ScrollViewer VerticalScrollBarVisibility="Hidden">
<WrapPanel x:Name="MainArea" VerticalAlignment="Bottom" HorizontalAlignment="Left">
</WrapPanel>
</ScrollViewer>
</DockPanel>
</DockPanel>
</ScrollViewer>
</DockPanel>
</UserControl>
It should just reload the page I am currently using and I can set the appPage at a later date, but it doesnt want to play ball. This works in my main window just not on my control but I dont set the button from code behind I use the xaml I first mention in my main window. Which tells me I am missing something from button click (I think is set correct), tag is set correctly but I am not sure name will be x:Name like my xaml code.
Although your code really confuses me, here is what isn’t working. Your constructing a fully qualified type name by
where
type.Namespacealready contains the complete namespace of the type in question and hence the “AppPages” part is needless. Instead, you should writeAnd why not simply do
when you only want to create a new instance of
FindStudent(which i guess is what you want to do).