2015-11-25 1 views
0

У меня возникла проблема с созданным пользователем событием. Я сделал UserControl, который выглядит следующим образом:Проблемы с событиями, вызываемыми Mousebuttonpressed C#

public partial class UCListView : UserControl { 
    public UCListView() { 
     InitializeComponent(); 
    } 

    public event EventHandler SubmitClick; 
    public event EventHandler MouseButtonUpEvent; 
    private void SubmitButton_OnClick(object sender, RoutedEventArgs e) { 
     if (SubmitClick != null) 
      SubmitClick(this, e); 
    } 

    private void MouseButtonUp(object sender, RoutedEventArgs e) { 
     if (MouseButtonUpEvent != null) { 
      MouseButtonUpEvent(this, e); 
     } 
    } 
} 

Вот событие MouseButtonUp я есть. Ниже, где я слушать событие:

public partial class RoundsteelWindow : WindowControls { 

    private UCListView uc; 
    public RoundsteelWindow() { 

     InitializeComponent(); 
     uc = new UCListView(); 
     uc.SubmitClick += new EventHandler(ButtonPressed); 
     uc.MouseButtonUpEvent += new EventHandler(MousePressed); 
     stkTest.Children.Add(uc); 
     base.Test<RoundSteel>(uc, "Roundsteel"); 
    } 
} 

Вот это WindowControls, где метод MousePressed можно увидеть. Это то же самое, что и фрагмент кода под этим кодом. На самом деле не вижу проблемы:

public abstract class WindowControls : Window { 

    public IMaterialWith14Elements _ReturnObject { get; set; } 
    public double amount { get; set; } 
    private UCListView _uc; 

    public void Test<T>(UCListView uc, string type) where T: IMaterialWith14Elements, new() { 
     _uc = uc; 
     List<T> test = MaterialLogic.GetList(type) as List<T>; 
     foreach (T material in test) { 
      uc.listView.Items.Add(material.Name); 
     } 
    } 
    private string str; 
    public void MousePressed(object sender, EventArgs eventArgs) { 
     var item = (sender as ListView).SelectedItem; 
     if (item != null) { 
      _ReturnObject = _uc.listView.SelectedItems as FlatSteel ; 
      str = item.ToString(); 
      _uc.amountText.IsEnabled = true; 
     } 
    } 

    public void ButtonPressed(object sender, EventArgs e) { 
     if (!string.IsNullOrEmpty(_uc.amountText.Text)) { 
      amount = _uc.amountText.Text.customParseToDouble(); 
      this.Close(); 
     } 
     else { 
      MessageBox.Show("Indtast venligst en værdi."); 
     } 
    } 
} 

Теперь проблема заключается в следующем: С помощью следующего кода он работает, но этот класс не используя windowcontrols. Он вызывается другим классом, который обрабатывает все кнопки.

 private void flatsteelListView_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs e) { 
     var item = (sender as ListView).SelectedItem; 
     if (item != null) { 
      _returnObject = flatsteelListView.SelectedItems as FlatSteel; 
      str = item.ToString(); 
      amountTextbox.IsEnabled = true; 
      FindObject(str); 
     } 
    } 

enter image description hereenter image description here enter image description here

Первая картинка показывает рабочее окно. Здесь не используется usercontrol. На самом деле это предыдущая проблема, с которой я работал, и получил помощь здесь в stackoverflow Help for thisissue. На втором рисунке показано следующее окно с помощью созданного пользовательского контроля. Событие кнопки работает и закрывает окно. Затем возникает вопрос, когда нажата клавиша listview. Он делает то же самое, что и на первой картинке (где она работает), но она дает мне нулевую ссылку, которая для меня не имеет никакого смысла. Я также проверил отправителя объекта, чтобы узнать, существует ли разница между отправителем этих двух разных окон.

Я просто не могу понять, почему это не работает.

поздравления darophi

Added with sender

+0

Очевидно, что ваш отправитель на экране не имеет типа ListView. Вы можете проверить это, разделив преобразование и затем проверив, является ли результат нулевым. – sprinter252

+1

Я просто оставлю [это] (http://stackoverflow.com/q/4660142/1997232) здесь. – Sinatr

+0

Было бы неплохо увидеть, что такое 'sender', вы можете его почти увидеть, но вы закрыли его в окне исключения. Проблема в том, что 'as' cast не работает и возвращает null, вам нужно сообщить нам, что такое' sender', когда происходит исключение. –

ответ

0

Ваш sender является объектом UCListView класса, который наследуется от UserControl и вы пытаетесь использовать его как ListView. Таким образом, в результате операции (sender as ListView) вы получаете null, потому что отправитель не является экземпляром класса ListView и не наследует его.

+0

Я сделал это с этим. Теперь это правильный тип: this.uc.listView.PreviewMouseLeftButtonUp + = новый System.Windows.Input.MouseButtonEventHandler (this.MousePressed); – darophi

+0

Итак, вы подписались на неправильное событие управления раньше. – melya

+0

Да, я сделал это. Но теперь это работает. Спасибо всем за их ответы. – darophi

Смежные вопросы