1

WPF アイテム (現在はタブ コントロールですが、将来的には ListBox、ListView、および ComboBox に対してこれを行う必要があります) の選択変更を防ぐ方法を探しています。

このスレッドに出くわし、回答としてマークされたのと同じ手法を使用しようとしました。

この手法では、タブ コントロールの項目のCollectionViewを取得し、 CollectionView の CurrentChanging イベントを処理して、選択が行われないようにします。

何らかの理由で、コードで CurrentChanging イベントが発生しません。

これは、私が使用している非常に単純なユーザー コントロールです。3 つのタブを持つタブ コントロールがあります。

(XAML)

<UserControl x:Class="UserControlWithTabs"
         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:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

    <TabControl x:Name="MainTabControl">
       <TabItem Header="First Tab">Content for the first tab</TabItem>
       <TabItem Header="Second Tab">Content for the second tab</TabItem>
       <TabItem Header="Third Tab">Content for the third tab</TabItem>
     </TabControl>
</UserControl>

ユーザー コントロールの VB.NET コードでは、タブ コントロールの項目の CollectionView を取得し、AddHandler メソッドを使用してイベントを監視しています。

(VB.NET)

Public Class UserControlWithTabs
  Private WithEvents mainTabCollectionView As CollectionView
  Private Sub UserControlWithTabs_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    mainTabCollectionView = CollectionViewSource.GetDefaultView(MainTabControl.Items)
    AddHandler mainTabCollectionView.CurrentChanging, AddressOf MainTabControl_ItemSelecting
  End Sub

  Private Sub MainTabControl_ItemSelecting(ByVal sender As Object, ByVal e As System.ComponentModel.CurrentChangingEventArgs)

  End Sub
End Class

MainTabControl_ItemSelecting メソッドにブレークポイントを設定したのですが、一向にヒットしません。

私は何を間違っていますか?

ありがとう、

-フリニー

4

2 に答える 2

1

に追加しようとしIsSynchronizedWithCurrentItem="True"ましたTabControlか?

于 2013-03-27T16:28:44.487 に答える
1

質問と回答の両方のおかげで、C#でこれを行うことができました。だから、C#コードビハインドでこのようなものが必要な人のために、私がそれをした方法は次のとおりです:

    mytab.IsSynchronizedWithCurrentItem = true; 
    mytab.Items.CurrentChanging += new CurrentChangingEventHandler(Items_CurrentChanging); 

    private void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
    {
        if (e.IsCancelable)
        {
            FrameworkElement elemfrom = ((ICollectionView)sender).CurrentItem as FrameworkElement;
            FrameworkElement elemto = mytab.SelectedItem as FrameworkElement; 
        }
        Console.WriteLine("tab is changing."); 
    }
于 2014-03-02T16:16:35.280 に答える