如何知道WPF用户控件被选中并显示?

时间:2016-09-13 12:26:48

标签: c# wpf xaml user-controls

我有一个用户控件在选项卡控件下显示多个实例

<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>

我的问题:

  1. 我可以在“OPHistorian”用户控件中使用哪个事件,当Usercontrol被标签显示时执行?我试过'GotFocus',但似乎没有用。

  2. 是否有任何属性告诉我当前正在显示用户控件(已在选项卡控件下选中)。我试过'OPHistorian1.isFocused',但似乎总是假的

3 个答案:

答案 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)。

  1. 您可以使用UserControl的Loaded事件来了解它何时被激活。 Read this.

答案 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);
            }
        }