Hi i have a tab load this usercontrol. when i wish to close this tab, i wish to call this cancelbutton_click event to pop up confirmation on closing, if OK, then close, if Cancel, the tab stays.
if i use Unloaded event, it will pop up twice before closing.
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
cancelbutton_click(sender,null);
}
Cancel button:
private void cancelButton_Click(object sender, RoutedEventArgs e)
{
MessageBoxResult objResult = MessageBox.Show("\nAre you sure you want to cancel?", "Cancel Confirmation", MessageBoxButton.OKCancel);
if (objResult == MessageBoxResult.OK)
{
try
{
TabItem tabItem = parentWindow.FindTabItemByName(ControlType.BusinessesContractors.ToString(), false);
this.parentWindow.mainTabControl.Items.Remove(tabItem);
this.parentWindow.statusTextBlock.Text = "Ready";
}
catch (Exception ex)
{
}
}
how to resolve this? thanks
Unloaded is called when the control is already being removed, it's not an event you want to handle often, just create a button which is supposed to close the tab, handle it's click, check if the user wants to cancel via the dialogue and close the tab if he does not.
Related
Is there a way to get OnItemRightTapped event on ListView or GridView that works exactly like ItemClick, except obviously react only on right tap?
You can add an event handler for mouse down and then determine the click source in the code:
private void listView_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Right)
{
// Do what u need to do here
}
else
e.Handled = true;
}
I don't know how to solve this. I have a Form2 which is opened via a Form1. Although the option "TopMost" is set to "false" the Form2 is still in the foreground. Clicking on the Form1 somewhere does nothing. Is there a way to solve this and let the Form2 pop up again into the Foreground when the button is clicked which opens it?
private void button_Click(object sender, EventArgs e)
{
if (form2.Visible == false)
{
form2 = new Form2(this);
form2.Show(this);
}
}
I was trying to show a form(FormChild), with some radio buttons in, just to select, close, and get the value of the selected radio button from the calling form(FormParent). On a click event handler for a Button in FormParent, I just did:
var formChild=newFormChild();
formChild.ShowDialog(this);
All was working great until I decided to handle the CheckedChanged event of one of the RadioButtons inside FormChild:
private void SomeRadioButton_CheckedChanged(object sender, EventArgs e)
{
Close();
}
Now the formChild.ShowDialog(this); did not showed formChild and formChild immediately returns DialogResult.Cancel.
Any explanation on this?
Thanks in advance
The lowest Tab Index radiobutton will be checked by default, If this event handler is assigned to that button it will cause the situation that you are describing.
You can either change your Tab Order or create a Boolean Flag that is set in your Forms Shown EventHandler to keep it from Triggering until you check it again.
public partial class Form1 : Form
{
bool initDone;
public Form1()
{
InitializeComponent();
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (initDone)
{
if (((RadioButton)sender).Checked == true)
{
Close();
}
}
}
private void Form1_Shown(object sender, EventArgs e)
{
initDone = true;
}
}
Is there anywhere if your code that sets the value of the RadioButton? If you programmatically set the "Checked" property of the RadioButton, it will fire the event.
In your situation, the event handler contains your Form.Close() so the form never gets the chance to be visible to the user.
Note: Setting the RadioButton.Checked as "true" in the designer will not fire the event.
If the user clicks on the overlay, I want the ChildWindow to automatically close and return the user to the main screen.
Is there a property that controls this? If not, is there a way to attach a click handler to the overlay?
Turns out you can get a reference to the overlay right after it is created. After that it is a simple matter of attaching the event handler.
private void Overlay_MouseButtonDown(object sender, MouseButtonEventArgs e)
{
this.Close();
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var overlay = (Grid)GetTemplateChild("Overlay");
overlay.MouseLeftButtonDown += Overlay_MouseButtonDown;
overlay.MouseRightButtonDown += Overlay_MouseButtonDown;
}
Is there anyway that a class can catch the last click in the application? Something like
public class MyClickManagerClass
{
public MyClickManagerClass()
{
// subscribe to a global click event
}
private void GlobalClickEventHandler(object sender, EventArgs e)
{
// do something with the click here
}
}
Thanks for your time!
If you only care to capture mouse clicks anywhere in a given Window, simply subscribing to the MouseDown or PreviewMouseDown at the window level does the trick.
If you really want it to be global to the application (and not just to the window), you should subscribe to the InputManager.PreProcessInput or InputManager.PostProcessInput event and watch for mouse events:
public MyClickManagerClass()
{
InputManager.Current.PreProcessInput += (sender, e) =>
{
if(e.StagingItem.Input is MouseButtonEventArgs)
GlobalClickEventHandler(sender,
(MouseButtonEventArgs)e.StagingItem.Input);
}
}
Note that "sender" will always be the InputManager but you can map coordinates to other controls with MouseEventArgs.GetPosition(visual).