Create a grid in WPF as Template programmatically

Posted by wickie79 on Stack Overflow See other posts from Stack Overflow or by wickie79
Published on 2010-12-23T08:56:32Z Indexed on 2010/12/23 12:54 UTC
Read the original article Hit count: 590

Filed under:
|
|

I want to create a basic user control with a style programmatically. In this style i want to add a Grid (no problem), but i dont can add column definitions to this grid. My example code is

            ControlTemplate templ = new ControlTemplate();
            FrameworkElementFactory mainPanel = new FrameworkElementFactory(typeof(DockPanel));
            mainPanel.SetValue(DockPanel.LastChildFillProperty, true);

            FrameworkElementFactory headerPanel = new FrameworkElementFactory(typeof(StackPanel));
            headerPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
            headerPanel.SetValue(DockPanel.DockProperty, Dock.Top);
            mainPanel.AppendChild(headerPanel);

            FrameworkElementFactory headerImg = new FrameworkElementFactory(typeof(Image));
            headerImg.SetValue(Image.MarginProperty, new Thickness(5));
            headerImg.SetValue(Image.HeightProperty, 32d);
            headerImg.SetBinding(Image.SourceProperty, new Binding("ElementImage") { RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent) });
            headerPanel.AppendChild(headerImg);

            FrameworkElementFactory headerTitle = new FrameworkElementFactory(typeof(TextBlock));
            headerTitle.SetValue(TextBlock.FontSizeProperty, 16d);
            headerTitle.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
            headerTitle.SetBinding(TextBlock.TextProperty, new Binding("Title") { RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent) });
            headerPanel.AppendChild(headerTitle);

            FrameworkElementFactory mainGrid = new FrameworkElementFactory(typeof(Grid));
            FrameworkElementFactory c1 = new FrameworkElementFactory(typeof(ColumnDefinition));
            c1.SetValue(ColumnDefinition.WidthProperty, new GridLength(1, GridUnitType.Star));
            FrameworkElementFactory c2 = new FrameworkElementFactory(typeof(ColumnDefinition));
            c2.SetValue(ColumnDefinition.WidthProperty, new GridLength(1, GridUnitType.Auto));
            FrameworkElementFactory c3 = new FrameworkElementFactory(typeof(ColumnDefinition));
            c3.SetValue(ColumnDefinition.WidthProperty, new GridLength(3, GridUnitType.Star));
            FrameworkElementFactory colDefinitions = new FrameworkElementFactory(typeof(ColumnDefinitionCollection));
            colDefinitions.AppendChild(c1);
            colDefinitions.AppendChild(c2);
            colDefinitions.AppendChild(c3);
            mainGrid.AppendChild(colDefinitions);

            mainPanel.AppendChild(mainGrid);

            FrameworkElementFactory content = new FrameworkElementFactory(typeof(ContentPresenter));
            content.SetBinding(ContentPresenter.ContentProperty, new Binding() { RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent), Path = new PropertyPath("Content") });
            mainGrid.AppendChild(content);

            templ.VisualTree = mainPanel;
            Style mainStyle = new Style();
            mainStyle.Setters.Add(new Setter(UserControl.TemplateProperty, templ));
            this.Style = mainStyle;

But the creation of FrameworkElementFactory with type ColumnDefinitionCollection will throw an exception "'ColumnDefinitionCollection' type must derive from FrameworkElement, FrameworkContentElement, or Visual3D."

Who can help me?

© Stack Overflow or respective owner

Related posts about c#

Related posts about wpf