2011-12-08 2 views
14
私はコード内で実行時に次の操作を行いたい

:これまでのところ私が持っているプログラムでコンテンツを持つデータテンプレートを作成するにはどうすればよいですか?

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

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

    return dataTemplate; 
} 

ヘルプ?私はこれがコントロールのスタイルを設定する最もエレガントな方法ではないことを知っていますが、色を指定するコンポーネントには、DataTemplate型の "PointTemplate"というプロパティがあります。

+1

コントロールをスタイルする場合は、ControlTemplateを使用する必要があります。データテンプレートは特定の方法でデータを表示することです。あなたの質問に戻ってきて、あなたは何のために色を設定したいですか? – MBen

+0

あなたのためにこの作品のような何かをしますか? DataTemplate asd = new DataTemplate(); asd.DataType = typeof(Rectangle); asd.VisualTree.SetValue(Rectangle.FillProperty、Brushes.Green); – peer

答えて

24

あなたはDataTemplateプログラムで、あなたはどうしたらを作成する必要が何らかの理由場合:次に、あなただけ追加する必要が

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()); 
    } 

XAML:どこかのコードで

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

DataTemplateResourceDictionaryとなりますのでご使用になれます。たとえば、コードの後ろに:

public MainWindow() 
    { 
     InitializeComponent(); 
     AddRectangleTemplateToResources(myGrid); 
    } 

希望します。

/// <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; 
    } 
} 

あなたはこのようなデータ・テンプレートを作成することができます:

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

あなたがあれば、あなたがどうなるとしてコントロールを作成するために、任意のコードを自由に使用することが次のヘルパークラスを使用して

+0

でした。ありがとうございました。 – Corpsekicker

+0

これは銀色のために可能ですか? –

+0

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

関連する問題