Creating a textbox in xaml through xaml.cs code - c#

I want to create textboxes in xaml file upon a button click through the .xaml.cs file from a loop (probably). I've calculated the margins for each textbox to appear in the panel but do not know how to bind the code. Here's the image of the xaml design view and what I'm trying to achieve. The window will have one textbox for choices appear and the loop will create another and another each time the add choice button is clicked.
Can anyone please help? I'm just learning wpf. Thank you

Assuming by Bind the code you mean how to add the TextBox to the panel. To do that, you need to add the textboxes to the Children property of the panel.
If you need to do this upon initialization of your form, then just place your code after InitializeComponent(); in the form constructor.
Here's an example how to do this programatically, responding to a click event:
Xaml:
<StackPanel Name="pn_Content" Orientation="Vertical">
<Button Click="btn_Add_TextBox_Click">Add Textbox</Button>
</StackPanel>
C#:
private void btn_Add_TextBox_Click(object sender, RoutedEventArgs e) {
TextBox tb = new TextBox();
tb.Height = 23;
tb.Width = 100;
pn_Content.Children.Add(tb);
}
and that's it.

First, place all the current text boxes in a container, for example a stack panel named stackPanel.
Then add your controls to the Children of the panel:
stackPanel.Children.Add(new TextBox { Text = "TextBox" });
please refer to these questions:
WPF: How to dynamically Add Controls in dynamically created WPF Window
Adding child controls in Stackpanel WPF C#

Related

C# WPF Create function that creats new inputs

I am using C# Wpf and i would like to create a function that once you click on a button A new Textbox will appear is this possible and I want to know if it possible to increase the form hight when a new Textbox is created
The question isnt exactly specific but yes you can make new UI elements in the code-behind. In WPF you would put your button on the window, then add the "Click" event to it. Then in the click event you could code something like. . .
private void Button_Click(object sender, RoutedEventArgs e)
{
Button newButton = new Button(); //Create a new button control and assign it to newButton
newButton.Width = 35; //Access fields like this (You can access any of the ones you access from the Xaml user interface)
newButton.Height = 20;
newButton.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
newButton.VerticalAlignment = System.Windows.VerticalAlignment.Top;
newButton.Content = "click me!";
grMain.Children.Add(newButton); //Add it to the grid
}
grMain is the name of my grid, make sure you name it and call it by the name. You can also call other elements, such as a stack panel or whatever you need. So for your case just make it a textbox instead of a button
Oops didnt see the second part of your question! To resize the window you need to first add a name to it in the XAML (Like you would name a grid or button - just name the window something). And just as we called grMain in my example call that and change the height/width properties.

How to use same textbox with other tabs on the tabcontrol?

Sorry for the simple question and also sorry if there is an answer on the site and I couldn't find.
I want to use same textbox in every tab that I use on my form. How can I do that?
Add this to the TabControl's SelectedIndexChanged event handler.
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
tabControl1.TabPages[tabControl1.SelectedIndex].Controls.Add(textBox1);
}
Adding a control to one tab page's Controls collection automatically removes it from the others.
Note: I have tested it by adding two lables on the form above the tab control and added these two lines to the method shown above:
label1.Text = tabControl1.TabPages[0].Controls.Count.ToString();
label2.Text = tabControl1.TabPages[1].Controls.Count.ToString();
Put the TextBox in the parent control of the TabControl. It can hover over all the rest. You might need to rework the focus traversal though.

Drag&Drop with WPF WebBrowser control - Drop event not firing

I'm currently in need to capture the Drop event of the WPF WebBrowser control but for some reason it's not firing. If I drag a .pdf file into the control it's being displayed but the Drop event isn't firing.
Small sample:
Create a new WPF project, add this inside the XAML code of the MainWindow.xaml between the Grid tags:
<WebBrowser Name="test" />
And change the MainWindow.xaml.cs so it looks like this:
public MainWindow()
{
InitializeComponent();
test.AllowDrop = true;
test.Drop += test_Drop;
}
void test_Drop(object sender, DragEventArgs e)
{
MessageBox.Show("Hi");
}
The messagebox will not be displayed when you drop a PDF file inside the WebBrowser control. What am I doing wrong?
You should try test.AllowDrop = true;. Take a look at this Tutorial
Edit:
After a few tries and a little research i found out that no Drag event will be fired at all. But maybe this question helps you here

Dynamically add a button - must be placed inside form tag

i am dynamically creating a button using C#. but i get an error when it get executed;
Control 'butidd' of type 'Button' must be placed inside a form tag with runat=server.
the code
Button but = new Button();
but.ID = "butidd";
but.Attributes.Add("runat", "server");
but.Text = "test";
but.Click += new EventHandler(but_click);
this.Controls.Add(but);
click event:
void but_click(object sender, EventArgs e){}
As the error clearly states, you need to add the control somewhere inside a <form runat="server">; not directly in the page.
If you want to add the control dynamically... Better create a panel in form design view and add the control dynamically to that panel...
If you create a panel on design view then it lays under the form tag...It is easiest one.... it avoids this type of confusions and errors...
try this link for reference... http://msdn.microsoft.com/en-us/library/kyt0fzt1.aspx

Dynamic Naming of C# Form Elements

My app needs to be able to dynamically create new form elements and work with them. Right now I have a panel with buttons and labels in it. I need to be able to make a duplicate of this and show it in my app and then work with it.
For example, I have panel1. Inside are label1, button1, and button2.
Label 1 just counts up by seconds.
When you click button1, label1 starts counting up. When you click button2, the timer stops.
My problem is that I need to be able to duplicate panel1 many times and still have the new buttons correspond to the correct labels.
On button_click
private void button1_Click(object sender, EventArgs e)
{
Button theSender = (Button)sender;
Panel parentPanel = (Panel)theSender.Parent;
}
From here, I can't target any of the child control . I'm used to targeting and handles in jQuery, so I don't even know the correct C# terminology for how to explain myself.
If understand your problem correctly, I recommend you to make a Usercontrol with a Panel and fill it with your Label, Button and whatever. Write the events for your buttons in the usercontrol. Then introduce this usercontrol in your form and it should work. You can introduce any number of usercontrols in your form and each button will behave/work for the label in that usercontrol only.
As you mentioned you are new in winforms and you are not sure what I am saying, let me know and I will help if I get enough time.
Hope it helps.
Children of a control can be accessed using Control.Contrtols collection, e.g. to access button on a form:
Button btn = this.Controls["button1"];
But that is only true if button1 is placed directly on your form and button1.Name property is set to "button1" (designer does that automattically, if you are creating your controls dynamically, you have to take care of naming your controls yourself.)
You can also enumerate child controls of any control, e.g. child controls of panel1:
foreach(Control c in panel1.Controls)
{
// do something, e.g.
if(c is Label){//do sth...}
if(c.Name.Equals("label1") && c is Label)
{
Label l = c as Label;
}
}
and as #rapsalands said, UserControl may be an answer for you.
I would create a user control (UserControl) for this.
Check this article for more explanation about the difference between Control and UserControl.
Controls and UserControls are easy to duplicate and the full functionality is there.
You can create new UI Controls in code as you would any other object: Button b = new Button();
Then you can add them to the form using form.Controls.Add(b). You'll need to position and size the controls as well (there are properties available for doing this) and hook up your event handlers using b.Clicked += form.button_click;.
To see an example of this, you can try having a look at the designer.cs file that is generated in Visual Studio (don't make changes to it, just have a look). It will look quite complex at first but might go some way to helping demystify Windows Forms, and you will be able to find all of the properties you need to set in there.
Whenever you update something in the designer, Visual Studio generates new code and puts it in the designer.cs file. The entire form is set up in the InitializeComponent() method, which is called from the constructor of your form. You should be able to copy some of that code and with a couple of modifications use it for creating your own dynamic UI elements.
As rapsalands says, it sounds like a user control would be useful in this situation, as it will help encapsulate the functionality you're after. However that may take a bit of time to get your head round and you may find it simpler for now to do everything in your form without creating a new control.
So you are a beginner and need some time to understand Usercontrol as I mentioned in my previous answer. Use a for loop in the Constructor or Load event of your form to dynamically generate controls.
Panel panel;
Label label;
Button button1;
Button button2;
for(int i = 0; i > count; i++)
{
panel = new Panel();
button1 = new Button();
button2 = new Button();
label = new Label();
panel.Controls.Add(button1);
panel.Controls.Add(button2);
panel.Controls.Add(label);
Controls.Add(panel);
button1.Click += Event1;
button2.Click += Event2;
}
private void Event1()
{
label.Text = "Button 1 Clicked."
}
private void Event2()
{
label.Text = "Button 2 Clicked."
}
This way certainly you can create as many controls you want and will also serve your purpose. Use some variables to locate the panel controls appropriately. Set any properties you wish to add in the for loop for the controls.
This is just an alternative for my previous answer. I still recommend the previous answer given by me. This code is dummy and not tested.
Hope it helps.

Categories

Resources