【问题标题】:How to call a method from programmatically created buttons with different parameters?如何从具有不同参数的编程创建的按钮中调用方法?
【发布时间】:2015-01-18 11:50:26
【问题描述】:

我的问题是如何使用按钮特定参数从另一个对象调用现有方法。 这是我需要调用的方法(来自 MainWindow):

partial class Sidebar : Window
{
    [...]
    internal void SetPosition(System.Drawing.Rectangle workingarea, bool left)
    {
      Overlay.Properties.Settings.Default.SidebarSide = left;
      Overlay.Properties.Settings.Default.Top = this.Top = workspace.Top;
      Overlay.Properties.Settings.Default.Left = this.Left = workspace.Left;
      Overlay.Properties.Settings.Default.Save();
      this.Height = workspace.Height;
      this.Width = workspace.Width;
      timeGrid.Style = gridStyle;
      Refresh();
    }
    [...]
}

以下是为连接到机器的每个屏幕创建按钮(以及更多)的方法

class SettingsWindow : Window
{
    [...]
    private void SidebarTab_Initialized(object sender, EventArgs e)
            {
                Canvas monitorCanvas = new Canvas();
                spPosition.Children.Add(monitorCanvas);

            System.Windows.Forms.Screen currentScreen = System.Windows.Forms.Screen.FromHandle(
                new System.Windows.Interop.WindowInteropHelper(this).Handle);
            System.Windows.Forms.Screen[] screens = System.Windows.Forms.Screen.AllScreens;

            Point min = new Point(0,0);
            Point max = new Point(0,0);

            for (int i = 0; i < screens.Length; i++)
            {
                min.X = min.X < screens[i].Bounds.X ? min.X : screens[i].Bounds.X;
                min.Y = min.Y < screens[i].Bounds.Y ? min.Y : screens[i].Bounds.Y;

                max.X = max.X > (screens[i].Bounds.X + screens[i].Bounds.Width) ? max.X : (screens[i].Bounds.X + screens[i].Bounds.Width);
                max.Y = max.Y > (screens[i].Bounds.Y + screens[i].Bounds.Height) ? max.Y : (screens[i].Bounds.Y + screens[i].Bounds.Height);
            }
            [...]


            for (int i = 0; i < screens.Length; i++)
            {

                Border monitor = new Border();
                monitor.BorderBrush = Brushes.Black;
                monitor.BorderThickness = new Thickness(1);
                Canvas.SetTop(monitor, (screens[i].Bounds.Top - min.Y) / scale);
                Canvas.SetLeft(monitor, (screens[i].Bounds.Left - min.X) / scale);
                monitor.Width = screens[i].Bounds.Width / scale;
                monitor.Height = screens[i].Bounds.Height / scale;

                DockPanel dp = new DockPanel();

                Button monLeft = new Button();
                monLeft.Width = scale;
                DockPanel.SetDock(monLeft, Dock.Left);

                Button monRight = new Button();
                monRight.Width = scale;
                DockPanel.SetDock(monRight, Dock.Right);
                [...]
                }
            }

}

如您所见,机器上的每个屏幕都需要两个按钮。
monLeft.Click = SetPosition(screens[i].WorkingArea, true);
monRight.Click = SetPosition(screens[i].WorkingArea, true); 是我需要的。

提前致谢。

【问题讨论】:

    标签: c# wpf methods click raise


    【解决方案1】:

    使用 lambda 定义事件处理程序。这允许您关闭处理程序中需要的局部变量。

    请注意,闭包会关闭变量,而不是值,因此您不想关闭 i(在事件触发时它不会是您想要的值)。您需要在循环内制作循环变量的副本,以便您可以关闭 that。好吧,或者使用 foreach 循环(在 C# 5.0+ 中)而不是 for 循环。

    foreach(var screen in screens)
    {
        //...
    
        Button monRight = new Button();
        monRight.Width = scale;
        DockPanel.SetDock(monRight, Dock.Right);
        monRight.Click += (s,e) => SetPosition(screen.WorkingArea, true);
    }
    

    【讨论】:

    • 谢谢,我缺少的是复制变量。所以这个提示对我帮助最大。
    【解决方案2】:

    嗯,正如您在http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.click(v=vs.110).aspx 中看到的,Button.Click 是一个事件,因此您需要为其分配一个事件处理程序:

    您可以将 SetPosition() 方法包装在事件处理程序中并将您的 Button.Click 事件的事件处理程序分配给它,或者您可以按照上一个答案中的建议通过 lambda 构造来完成。

    另一种方法是为按钮设置Button.Command,方法是实现ICommand 的实例,该实例将调用SetPosition() 方法。

    【讨论】:

    • 嗯,在互联网上找到的信息,如果我不知道该照顾什么,在某些地方会有所帮助。但我感谢你的帮助
    • 嗯,这个想法是为了向您表明您错误地使用了Click 事件。此外,我还提供了有关如何使用Button.Command 的信息。但我很高兴你找到了解决方案! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多