2011-12-08 25 views
14
Ben kodunda zamanında aşağıdaki yapmak istiyorum

: Şimdiye kadar bendeİçeriğe programlı olarak nasıl bir veri sayfası oluştururum?

<DataTemplate x:Key="lightGreenRectangle"> 
     <Rectangle Fill="LightGreen"/> 
    </DataTemplate> 

:

public DataTemplate GetColouredRectangleInDataTemplate(Color colour) 
{ 
    DataTemplate dataTemplate = new dataTemplate(); 

    return dataTemplate; 
} 

Yardım? Bunun bir kontrol stili oluşturmanın en zarif yolu olmadığını biliyorum, ancak bir renk belirtmek istediğim bileşen, DataTemplate türünde "PointTemplate" adlı bir özelliğe sahip. Sebebi ne olursa olsun programlı bir DataTemplate oluşturmanız gerekiyorsa

+1

, datatemplate belirli bir şekilde verileri görüntülemek etmektir. Size soruları geri gel, ne için renk ayarlamak istiyorsun? – MBen

+0

Bu çalışma sizin gibi bir şey yapar mı? DataTemplate asd = new DataTemplate(); asd.DataType = typeof (Rectangle); asd.VisualTree.SetValue (Rectangle.FillProperty, Brushes.Green); – peer

cevap

24

yapardın:

XAML:

yerde kodunuzu
<Grid x:Name="myGrid"> 
    <ContentControl ContentTemplate="{DynamicResource lightGreenRectangle}" /> 
</Grid> 

:

public static DataTemplate CreateRectangleDataTemplate() 
    { 
     var rectangleFactory = new FrameworkElementFactory(typeof(Rectangle)); 
     rectangleFactory.SetValue(Shape.FillProperty, new SolidColorBrush(System.Windows.Media.Colors.LightGreen)); 

     return new DataTemplate 
        { 
         VisualTree = rectangleFactory, 
        }; 
    } 

    public static void AddRectangleTemplateToResources(FrameworkElement element) 
    { 
     element.Resources.Add("lightGreenRectangle", CreateRectangleDataTemplate()); 
    } 

Sonra sadece eklemeniz gerekir DataTemplate, ResourceDictionary için kullanılabilir. Örneğin, aşağıdaki kodda:

Umarım bu yardımcı olur!

+0

Yaptı. Teşekkür ederim. – Corpsekicker

+0

Silverlight için bu mümkün mü? –

+0

Nevermind, bulundu: http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx –

6

aşağıdaki yardımcı sınıf kullanma: Sen eğer yapacak şekilde kontrolünü oluşturmak için herhangi bir kod kullanmakta serbesttirler

DataTemplate template = 
    TemplateGenerator.CreateDataTemplate 
    (
    () => 
    { 
     var result = new TextBox() 
     result.SetBinding(TextBox.TextProperty, "BindingPathHere"); 
     return result; 
    } 
); 

: Böyle bir veri şablonu oluşturabilirsiniz

/// <summary> 
/// Class that helps the creation of control and data templates by using delegates. 
/// </summary> 
public static class TemplateGenerator 
{ 
    private sealed class _TemplateGeneratorControl: 
    ContentControl 
    { 
    internal static readonly DependencyProperty FactoryProperty = DependencyProperty.Register("Factory", typeof(Func<object>), typeof(_TemplateGeneratorControl), new PropertyMetadata(null, _FactoryChanged)); 

    private static void _FactoryChanged(DependencyObject instance, DependencyPropertyChangedEventArgs args) 
    { 
     var control = (_TemplateGeneratorControl)instance; 
     var factory = (Func<object>)args.NewValue; 
     control.Content = factory(); 
    } 
    } 

    /// <summary> 
    /// Creates a data-template that uses the given delegate to create new instances. 
    /// </summary> 
    public static DataTemplate CreateDataTemplate(Func<object> factory) 
    { 
    if (factory == null) 
     throw new ArgumentNullException("factory"); 

    var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl)); 
    frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory); 

    var dataTemplate = new DataTemplate(typeof(DependencyObject)); 
    dataTemplate.VisualTree = frameworkElementFactory; 
    return dataTemplate; 
    } 

    /// <summary> 
    /// Creates a control-template that uses the given delegate to create new instances. 
    /// </summary> 
    public static ControlTemplate CreateControlTemplate(Type controlType, Func<object> factory) 
    { 
    if (controlType == null) 
     throw new ArgumentNullException("controlType"); 

    if (factory == null) 
     throw new ArgumentNullException("factory"); 

    var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl)); 
    frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory); 

    var controlTemplate = new ControlTemplate(controlType); 
    controlTemplate.VisualTree = frameworkElementFactory; 
    return controlTemplate; 
    } 
} 

Herhangi bir veri şablonu olmadan doğrudan denetimi yaratıyordunuz. fazla bilgi için, kod projesinde bu ipucunu bkz: Eğer bir ControlTemplate kullanmalıdır bir denetim biçemlemek isterseniz http://www.codeproject.com/Tips/808808/Create-Data-and-Control-Templates-using-Delegates

İlgili konular