[英]how to handle TabItem single click event in WPF?
在我的應用程序中,我使用了WPF TabControl
我想處理TabItem
click事件。 我如何實現它?
您可以通過向tabcontrol中每個tabitem的header屬性添加標簽來完成此操作。 然后,您可以為標簽設置事件。
XAML
<TabControl Height="100" HorizontalAlignment="Left" Name="tabControl1">
<TabItem Name="tabItem1">
<TabItem.Header>
<Label Content="tabItem1"
MouseLeftButtonDown="tabItem1_Clicked"
HorizontalAlignment="Stretch"/>
</TabItem.Header>
<Grid />
</TabItem>
<TabItem Name="tabItem2">
<TabItem.Header>
<Label Content="tabItem2"
MouseLeftButtonDown="tabItem2_Clicked"
HorizontalAlignment="Stretch"/>
</TabItem.Header>
<Grid />
</TabItem>
</TabControl>
C#/ Code Behind
private void tabItem1_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
private void tabItem2_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
希望這可以幫助。
這是一個古老的問題,但我在相同的情況下找到答案。
我在TabControl(XAML)上使用SelectionChanged事件
<TabControl SelectionChanged="TabControl_SelectionChanged">
代碼背后(C#):
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//Stuff
}
這不是點擊他自己,而是為了讓人耳目一新。
您可以在TabControl中使用SelectionChanged事件並使用switch case執行您喜歡的任何操作。
// XAML代碼
<TabControl SelectionChanged="TabControl_SelectionChanged">
<TabItem Header="Item1"></TabItem>
<TabItem Header="Item2"></TabItem>
<TabItem Header="Item3"></TabItem>
</TabControl>
//代碼背后
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string tabItem = ((sender as TabControl).SelectedItem as TabItem).Header as string;
switch(tabItem)
{
case "Item1":
break;
case "Item2":
break;
case "Item3":
break;
default:
return;
}
}
將標題包裹在無模板按鈕中。
如果您使用ItemsSource:
<TabControl ItemsSource="{Binding Data}">
<TabControl.ItemTemplate>
<DataTemplate>
<Button Click="Tab_Click">
<Button.Template>
<ControlTemplate>
<ContentPresenter />
</ControlTemplate>
</Button.Template>
<Button.Content>
<!-- Actual header goes here -->
</Button.Content>
</Button>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
如果您有靜態內容,可以立即將其插入標題:
<TabControl>
<TabItem>
<TabItem.Header>
<Button Click="Tab_Click">
<Button.Template>
<ControlTemplate>
<ContentPresenter />
</ControlTemplate>
</Button.Template>
<Button.Content>
<!-- Actual header goes here -->
</Button.Content>
</Button>
</TabItem.Header>
</TabItem>
</TabControl>
您可以通過向tabcontrol中每個tabitem的header屬性添加標簽來完成此操作。 然后,您可以為標簽設置事件。
解決方案效果很好; 但是,“label”具有margin屬性,可以防止“MouseLeftButtonDown”處理程序被觸發,除非用戶單擊標簽為dead。 此外,由於標簽填充,看起來其余選項卡的樣式會受到影響。
您可以通過覆蓋標簽的默認邊距/填充屬性來緩解這種情況......或者更簡單地說,使用TextBlock。
<TabItem x:Name="tabItem1" >
<TabItem.Header>
<TextBlock MouseLeftButtonDown="tabItem1_Click">
Click Me
</TextBlock>
</TabItem.Header>
...
</TabItem>
請注意,雖然d.moncada和其他人提供的答案解決了這個問題,但問題本身可能不是預期的。 知道用戶何時點擊選項卡不同於知道用戶何時最前面的選項卡 - 可以通過單擊選項卡來完成,但也可以通過其他方式實現。 例如,如果單擊最前面的選項卡,然后使用左/右箭頭,您可以在不單擊鼠標的情況下將另一個選項卡添加到前面 - 在這種情況下不會調用鼠標左鍵按鈕事件(正如你所料)。
嘗試使用GotFocus
事件找到解決方案。
private void addTabPage_GotFocus(object sender, RoutedEventArgs e)
{
addTabPage(); //method for adding page
TabControlPages.SelectedIndex = TabControlPages.Items.Count - 1; //select added page
TabControlPages.Focus(); //change forcus to selected page
}
還有添加頁面的方法(只是示例)
private void addTabPage()
{
TabItem tc = new TabItem();
tc.Header = "New page";
TabControlPages.Items.Insert(TabControlPages.Items.Count - 1, tc); //insert new page
}
希望這會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.