2017-07-11 13 views
0

私はWPFを初めて使用しています。私は1つのタブコントロールが2つのタブで構成されているプロジェクトを持っています。デフォルトの選択には、最初のタブ項目はプロパティ 'IsSelected = True'です。ユーザーによって変更されたタブ検出コントロールの選択

これは問題なく動作します。しかし、私はユーザーの変更イベントをキャプチャする必要があります。つまり、ユーザーが選択を変更した場合、その変更を値でキャプチャする必要があります。このために、 'FrameworkElementHandlerEventArgs'を実装して1つのイベント引数を作成しました。

私の既存のコードは次のとおりです。

public class SelectionChanagedEventArgs : FrameworkElementHandlerEventArgs 
    { 
     public object SelectedItem { get; set; } 
    } 

私はこれが唯一の私のコードの一部であり、変更

RegisterEvent<SelectionChangedEventArgs>(
       (sender, e) => 
       { 
        if (e == null) 
        { 
         return; 
        } 
        //Here i got the selection changes 
       }, 
handler,handler); 

をキャプチャするために、このイベントを登録しています。

これは問題なく動作しています。問題はデフォルトの選択です。アプリケーションが起動すると、デフォルト選択が実行され、イベントが変更されます。しかし、私はユーザーが変更したイベントだけをキャプチャする必要があります。任意のオプションはチェックのみ

答えて

0

IsLoadedプロパティを追加して、プレゼンテーションのためにコントロールが読み込まれているかどうかを確認しました。今すぐうまく動作します。このために別の問題が発生したと思われる場合は、共有してください。

次は私の更新コードです:文法について

RegisterEvent<SelectionChangedEventArgs>(
       (sender, e) => 
       { 
        if (e == null || !(sender as System.Windows.Controls.Control).IsLoaded) 
        { 
         return; 
        } 
        //Here i got the selection changes 
       }, 
handler,handler); 
+0

あなたは多かれ少なかれ同じことを示唆した他の回答をupvoteするつもりですか? – mm8

+0

また、ビュー自体のIsLoadedプロパティを確認することもできます。 – mm8

1

あなたは、イベントハンドラをフック前に、あなたのコードでプログラム最初TabItemIsSelectedプロパティを設定することができ、ユーザによって行われた変更を検出します。

それとも、単にすぐに最初の時間を返す、あなたのイベントハンドラが呼び出された回数を追跡し、変数を使用することができます。

int count; 
RegisterEvent<SelectionChangedEventArgs>(
(sender, e) => 
{ 
    if (e == null || count++ == 0) 
    { 
     return; 
    } 
    //Here i got the selection changes 
}, handler, handler); 

をまたはビューがロードされているかどうかを確認:

if (e == null || !IsLoaded) 

特定の「ユーザー変更イベント」はありません。ユーザーが実際にアクティブな選択をしたかどうかにかかわらず、まったく同じイベントが発生します。

+0

は試してみて、更新します。第二に、カウントは大丈夫です。しかし、コントロールの数は1つのタブコントロールだけではありません。そのため、単純な1つのカウントで2番目のコントロールからイベントが発生します。 – Akhil

+0

イベントハンドラをフックアップした後、IsSelectedプロパティを設定します。 – mm8

+0

はい。ページが表示されたら、タブの選択を更新する必要があります。選択の変更が発生したときにイベントが発生します – Akhil

0

あなたは前の選択があったかどうかを確認してみてください:tabはあなたのTabControl

 tab.SelectionChanged += (sender, e) => { 
      if (e.RemovedItems.Count == 0) 
       return; 

      //Here i got the selection changes 
     }; 

です。イベント引数を使用してカスタムクラスを作成する必要はありません。

+0

この 'e.RemovedItems.Count'プロパティは何ですか?カスタムイベントの引数に追加するロジック – Akhil

+0

@Akhilこれは選択されていないアイテムの一覧です。[this](https://msdn.microsoft.com/cs-cz/library/system.windows.controls.selectionchangedeventargs)を参照してください。削除された項目(v = vs.110).aspx)。そして、 'TabControl'は作成時に選択がないので、この簡単なチェックを実行して、望ましい機能を達成することができます。 – vasek

+0

こんにちはありがとうが、私はカスタムの引数を使用していないウィンドウの選択肢が変更されました。私は、FrameworkElementHandlerEventArgsから継承したカスタムクラスを使用します。どうしたらいいですか? – Akhil

関連する問題