コード例 #1
0
        /// <summary>
        /// Updates the focused <see cref="DataGridColumnHeader"/>.
        /// </summary>
        private static void UpdateFocusedHeader(DataGridControl datagrid)
        {
            if (null == datagrid)
            {
                return;
            }

            // Get the list of headers
            IList <DependencyObject> headers = VisualTreeHelperExtended.GetAllDescendants(datagrid, typeof(DataGridColumnHeader));

            if (null == headers || 0 == headers.Count)
            {
                return;
            }

            // Update the focus based on the current tracking Modes
            FocusTrackingModes trackingModes = GetTrackingModes(datagrid);

            if (0 != (trackingModes & FocusTrackingModes.Headers))
            {
                // Get the focused cell, if any, and look for an ancestor cell when editing cell
                DataGridCell cell = Keyboard.FocusedElement as DataGridCell;
                if (cell == null)
                {
                    cell = VisualTreeHelperExtended.GetAncestor(Keyboard.FocusedElement as FrameworkElement, typeof(DataGridCell)) as DataGridCell;
                }

                // Update header focus, if any
                foreach (DataGridColumnHeader header in headers)
                {
                    // Determine if the column associated with this header if focused
                    bool isFocused = (null != cell && cell.Column == header.Column);

                    // Update the focus for this header
                    if (isFocused != GetIsFocusedHeader(header))
                    {
                        if (isFocused)
                        {
                            header.SetValue(IsFocusedHeaderPropertyKey, true);
                        }
                        else
                        {
                            header.ClearValue(IsFocusedHeaderPropertyKey);
                        }
                    }
                }
            }
            else
            {
                // Clear header focus, if any
                foreach (DataGridColumnHeader header in headers)
                {
                    if (GetIsFocusedHeader(header))
                    {
                        header.ClearValue(IsFocusedHeaderPropertyKey);
                    }
                }
            }
        }
コード例 #2
0
 public static void SetTrackingModes(DataGridControl obj, FocusTrackingModes value)
 {
     if (null == obj)
     {
         throw new ArgumentNullException("obj");
     }
     obj.SetValue(FocusBehavior.TrackingModesProperty, value);
 }
コード例 #3
0
        /// <summary>
        /// Called when <see cref="TrackingModesProperty"/> is changed.
        /// </summary>
        /// <param name="d">The dependency object that was changed.</param>
        /// <param name="e">The <see cref="DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
        private static void OnTrackingModesPropertyValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DataGridControl datagrid = d as DataGridControl;

            if (null == datagrid)
            {
                return;
            }

            FocusTrackingModes trackingModes = (FocusTrackingModes)e.NewValue;

            if (FocusTrackingModes.None != trackingModes)
            {
                datagrid.AddHandler(UIElement.GotFocusEvent, (RoutedEventHandler)OnDataGridGotFocus, true);
                datagrid.AddHandler(UIElement.LostFocusEvent, (RoutedEventHandler)OnDataGridLostFocus, true);
            }
            else
            {
                datagrid.RemoveHandler(UIElement.GotFocusEvent, (RoutedEventHandler)OnDataGridGotFocus);
                datagrid.RemoveHandler(UIElement.LostFocusEvent, (RoutedEventHandler)OnDataGridLostFocus);
            }

            UpdateFocusedHeader(datagrid);
        }