0

我的项目中有一个奇怪的问题。有由用户控件和菜单栏(也是用户控件)组成的页面。

这是我的用户控件,其中包含几个按钮

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

    public event EventHandler EventbtClicked;
    private void btConnect_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        EventbtClicked(this, e);
    }    
}

我在我的页面中添加了如下:

<local:UpperBar VerticalAlignment="Top" Grid.Row="0" Height="78" Grid.ColumnSpan="3" Margin="0,2,0,0"/>

在我的页面中尝试调用事件:

public PageStatus()
{
    InitializeComponent();
    Plc.ExecuteRefresh += new EventHandler(RefreshLeds);


   UpperBar.EventbtCliced += new EventHandler(UpperBatButtonClick);  
}

protected void UpperBarButtonClick(object sender, EventArgs e)
{
    //do something
}

但是我无法使用它访问我的活动UpperBar.EventbtCliced,为什么?

4

2 回答 2

2

您需要访问 PageStatus 中的 UpperBar 类的实例,而不是 UpperBar 类本身!

最简单的方法在这里:

  • 在 XAML 中命名 UpperBar,例如:

<local:UpperBar x:Name="_myBar" x:FieldModifier="private"/>

  • 然后在您的 PageStatus.xaml.cs 中使用此实例:

    public partial class MainWindow : Window    {
    public MainWindow()
    {
        InitializeComponent();
    
        _myBar.EventbtClicked += new EventHandler(UpperBarButtonClick);
    }
    
    protected void UpperBarButtonClick(object sender, EventArgs e)
    {
        //do something
    }
    

    }

现在,如果您在 WPF 中认真工作,您应该真正了解数据绑定和 MVVM,以这种方式捕获事件根本不是最好的方法。

于 2013-02-06T12:03:27.103 回答
0

您应该使用自定义命令 (RoutedUICommand) 而不是来自用户控件的冒泡事件。

与您的方法相比,这里有一些要遵循的步骤:

1:创建类 myCustomCommand。

      namespace WpfApplication1

      {

         public  class myCustomCommand.
          {

               private static RoutedUICommand _luanchcommand;//mvvm

                 static myCustomCommand.()
                  {
               System.Windows.MessageBox.Show("from contructor"); // static consructor is                                                 called when static memeber is first accessed(non intanciated object)
       InputGestureCollection gesturecollection = new InputGestureCollection();
       gesturecollection.Add(new KeyGesture(Key.L,ModifierKeys.Control));//ctrl+L
       _luanchcommand =new RoutedUICommand("Launch","Launch",typeof(myCustomCommand.),gesturecollection);

   }
   public static  RoutedUICommand Launch
   {
       get
       {
           return _luanchcommand;
       }
   }

}

   }

在 UserControl 的 xaml 中:

                    <UserControl x:Class="WpfApplication1.UserControl1"

         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

          xmlns:CustomCommands="clr-namespace:WpfApplication1"

         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

                <UserControl.CommandBindings> 
              <CommandBinding Command="CustomCommands:myCustomCommand.Launch" Executed="CommandBinding_Executed">

    </CommandBinding>
</UserControl.CommandBindings>
<Grid >
    <TextBox  Name="mytxt"   Height="30" Width="60" Margin="50,50,50,50" ></TextBox>
    <Button Name="b" Height="30" Width="60" Margin="109,152,109,78" Command="CustomCommands:ZenabUICommand.Launch"></Button>

</Grid>

现在在用户控制代码中

处理 command_executed

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        mytxt.Text = "invoked on custom command";
    }
}

}

于 2013-02-06T18:03:31.927 回答