我有一个用户控件在选项卡控件下显示多个实例
<TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="616" Margin="0,20,0,20" VerticalAlignment="Top" Width="1282" Grid.ColumnSpan="2">
<TabItem Header=" OPHistorianCutter " Padding="0">
<OP:Historian x:Name="OPHistorianCutter1" />
</TabItem>
<TabItem Header=" OPHistorianCutter " Padding="0">
<OP:Historian x:Name="OPHistorianCutter2" />
</TabItem>
<TabItem Header=" OPHistorianCutter " Padding="0">
<OP:Historian x:Name="OPHistorianCutter3" />
</TabItem>
</TabControl>
我的问题:
我可以在“OPHistorian”用户控件中使用哪个事件,当Usercontrol被标签显示时执行?我试过'GotFocus',但似乎没有用。
是否有任何属性告诉我当前正在显示用户控件(已在选项卡控件下选中)。我试过'OPHistorian1.isFocused',但似乎总是假的
答案 0 :(得分:1)
1。您可以使用tabControl的SelectionChanged
事件来了解显示哪个tabItem。
SelectionChanged="TabControl_OnSelectionChanged"
private void TabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
throw new NotImplementedException();
}
2。您可以使用SelectedIndex
获取所选标签:
tabControl.SelectedIndex
或使用tabItem
tabItem.IsSelected
您可以通过从父控件获取属性来在UserControl上报告这些属性:
public bool IsSelected
{
get
{
var tabitem = Parent as TabItem;
return tabitem != null && tabitem.IsSelected;
}
}
编辑
您可以使用isVisible属性和相关事件:
<TabControl>
<TabItem Header="1">
</TabItem>
<TabItem Header="2">
<local:UserControl1 IsVisibleChanged="UIElement_OnIsVisibleChanged"></local:UserControl1>
</TabItem>
<TabItem></TabItem>
</TabControl>
private void UIElement_OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var uc = sender as UserControl1;
}
答案 1 :(得分:1)
1。您可以使用tabControl的SelectionChanged事件来了解显示哪个tabItem(和UserControl)。
答案 2 :(得分:0)
感谢您的所有回复,但我找到了解决方案。必须使用visualtreehelper来查找父容器,并查看它是否在可视范围内。
public bool IsUserVisible
{
get
{
UIElement element = (UIElement)this;
if (!element.IsVisible)
return false;
var container = VisualTreeHelper.GetParent(element) as FrameworkElement;
if (container == null) throw new ArgumentNullException("container");
Rect bounds = element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.RenderSize.Width, element.RenderSize.Height));
Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
return rect.IntersectsWith(bounds);
}
}