0

我的问题是如何使用按钮特定参数从另一个对象调用现有方法。这是我需要调用的方法(来自 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);

提前致谢。

4

2 回答 2

1

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

请注意,闭包会关闭变量,而不是值,因此您不想关闭i(在事件触发时它不会是您希望它成为的值)。您需要在循环内制作循环变量的副本,以便您可以关闭。好吧,或者使用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);
}
于 2014-11-20T15:03:43.380 回答
0

好吧,正如您在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()方法的实例。

于 2014-11-20T15:13:20.183 回答