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

クラス UpperBar 自体ではなく、PageStatus のクラス 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 で真剣に作業している場合は、Databinding と 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 に答える