How to create reusable WPF grid layout

前端 未结 6 1769
傲寒
傲寒 2020-12-10 01:13

I have a window with tab control and number of pages - tab items. Each tab item has same grid layout - 6 rows and 4 columns. Now, each tab item contains grid with row and co

6条回答
  •  再見小時候
    2020-12-10 01:55

    You can do it but it requires some work:

    1) Create a collection and an attached property like this:

    public class ColumnDefinitions : Collection
    {
        public static readonly DependencyProperty SourceProperty = DependencyProperty.RegisterAttached(
            "Source",
            typeof(ColumnDefinitions),
            typeof(ColumnDefinitions),
            new PropertyMetadata(
                default(ColumnDefinitions), 
                OnColumnDefinitionsChanged));
    
        public static void SetSource(Grid element, ColumnDefinitions value)
        {
            element.SetValue(SourceProperty, value);
        }
    
        [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
        [AttachedPropertyBrowsableForType(typeof(Grid))]
        public static ColumnDefinitions GetSource(Grid element)
        {
            return (ColumnDefinitions)element.GetValue(SourceProperty);
        }
    
        private static void OnColumnDefinitionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var grid = (Grid)d;
            grid.ColumnDefinitions.Clear();
            var columnDefinitions = (ColumnDefinitions)e.NewValue;
            if (columnDefinitions == null)
            {
                return;
            }
    
            foreach (var columnDefinition in columnDefinitions)
            {
                grid.ColumnDefinitions.Add(columnDefinition);
            }
        }
    }
    

    2) Then you can use it as a resource and in a style for grid like this: Note that x:Shared="False" must be used. If not the same definition will be added to many grids causing WPF to throw.

    
        
            
            
        
    
        
    
    
        
            
            
            
        
        
            
            
        
    
        
            
            
        
    
    

提交回复
热议问题