【问题标题】:Mousebuttonpressed event Issues C#Mousebuttonpressed 事件问题 C#
【发布时间】:2015-11-25 13:04:59
【问题描述】:

我创建的自定义事件有问题。我制作了一个如下所示的用户控件:

    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 方法。这与此代码下方的代码 sn-p 相同。真的没看到问题:

    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.");
        }
    }
}

现在问题如下:使用以下代码它可以工作,但是这个类没有使用窗口控件。它由处理所有按钮的另一个类调用。

        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);
        }
    }

第一张图片显示了工作窗口。这是没有使用用户控件的地方。实际上,这是我在 stackoverflow Help for thisissue 上处理过并获得帮助的上一个问题。 第二张图片显示了使用已创建的用户控件的下一个窗口。按钮事件起作用并关闭窗口。当按下列表视图项时,问题就来了。它与第一张图片(它工作的地方)做同样的事情,但它给了我一个空引用,这对我来说没有任何意义。我还检查了对象发送者,看看这两个不同窗口的发送者之间是否存在差异。

我只是不明白为什么这不起作用。

你好,达罗菲

【问题讨论】:

  • 显然您在 Screenshow 中的发件人不是 ListView 类型。您可以通过分离转换然后检查结果是否为空来检查这一点。
  • 我就把this留在这里。
  • 很高兴看到sender 是什么,您几乎可以看到它,但您被异常窗口掩盖了。问题是 as 转换不起作用并返回 null,您需要告诉我们 sender 是什么时候发生异常。
  • 我添加了一张可以看到发件人的图片

标签: c# wpf user-controls window


【解决方案1】:

您的sender 是UCListView 类的对象,它继承自UserControl,您正尝试像ListView 一样使用它。因此,(sender as ListView) 操作的结果是 null,因为 sender 不是 ListView 类的实例,也没有继承它。

【讨论】:

  • 我已经让它工作了。现在它是正确的类型:this.uc.listView.PreviewMouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.MousePressed);
  • 是的,我搞砸了。但现在它起作用了。感谢大家的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多