2013-02-19 3 views
0

У меня есть ResourceDictionary, который содержит определения стилей элементов управления, используемых в моем приложении.Стиль окна не применяется при динамическом построении DataTemplate

Все стили правильно применяются к элементам управления в окне.

В одном конкретном случае мне нужно динамически строить DataTemplate и Grid кодом (в коде позади). Когда мой элемент управления отображается, все элементы и данные отображаются правильно, но, похоже, стиль не применяется. Когда я нажимал на границу моего экрана для изменения размера, стиль применяется в этот конкретный момент.

Почему? И что я могу сделать для применения стиля при отображении элемента управления?

EDIT Вот мой Xaml:

<Common:MyPopUpWindow 
    ... 
    ... 
    > 
    <Common:MyPopUpWindow.DataContext> 
     <Controls:DynamicPicklistControlViewModel/> 
    </Common:MyPopUpWindow.DataContext> 
    <Grid x:Name="LayoutRoot" Margin="2" Behaviours:ToolbakKeyBehaviour.IsEnabled="True"> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="auto" /> 
     </Grid.RowDefinitions> 

     <Grid x:Name="grdPicklist"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Common:MyBlockListBox x:Name="lbxPicklist" 
           Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="99" /> 
     </Grid> 
     <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right"> 
     ... 
     ... 
     </StackPanel> 
    </Grid> 
</Common:MyPopUpWindow > 

И это мой код позади:

private void OnShowPicklist(DynamicPicklistControlViewModel.ShowPicklistMessage obj) 
    { 
    if (!IsVisible) 
    { 
     CreateDataTemplate(obj.ColumnSpecs); 
     CreateGridLayout(obj.ColumnSpecs); 
     ShowDialog(); 
    } 
    } 

    private void CreateDataTemplate(IEnumerable<AdmPicklistColSpec> columnSpecs) 
    { 
    var xaml = new StringBuilder(); 

    xaml.AppendLine("<ResourceDictionary xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' "); 
    xaml.AppendLine("     xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' "); 
    xaml.AppendLine("     xmlns:Common='clr-namespace:Xxx.Xxxxxxxxxx.Xxx.Xxxx.Client.Common'>"); 
    xaml.AppendLine(""); 
    xaml.AppendLine(" <DataTemplate x:Key='dtplPicklist'>"); 
    xaml.AppendLine("  <Grid x:Name='grdPicklist'>"); 
    xaml.AppendLine("   <Grid.ColumnDefinitions>"); 

    for (var i = 0; i < columnSpecs.Count(); i++) 
    { 
     xaml.AppendLine("   <ColumnDefinition Width='*'/>"); 
    } 

    xaml.AppendLine("   </Grid.ColumnDefinitions>"); 
    xaml.AppendLine("   <Grid.RowDefinitions>"); 
    xaml.AppendLine("   <RowDefinition Height='{StaticResource DefaultListBoxItemHeight}' />"); 
    xaml.AppendLine("   </Grid.RowDefinitions>"); 
    xaml.AppendLine(""); 

    var iCol = 0; 
    foreach (var colSpec in columnSpecs) 
    { 
     xaml.AppendLine("   <Common:MyFormTextBox x:Name='txtCol" + colSpec.DisplaySeqNbr + "' "); 
     xaml.AppendLine("         Grid.Column='" + iCol + "' "); 
     xaml.AppendLine("         Text='{Binding Path=Col" + colSpec.DisplaySeqNbr + "}' />"); 

     iCol++; 
    } 

    xaml.AppendLine("  </Grid>"); 
    xaml.AppendLine(" </DataTemplate>"); 
    xaml.AppendLine("</ResourceDictionary>"); 

    var xamlParse = (ResourceDictionary)XamlReader.Parse(xaml.ToString()); 
    foreach (var key in xamlParse.Keys) 
    { 
     Resources.Add(key, xamlParse[key]); 
    } 
    } 

    private void CreateGridLayout(IEnumerable<AdmPicklistColSpec> columnSpecs) 
    { 
    var grid = grdPicklist; 

    if (_multiplePicklist) 
     grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) }); 

    // <ColumnDefinition> 
    for (var i = 0; i < columnSpecs.Count(); i++) 
    { 
     var colDef = new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }; 
     grid.ColumnDefinitions.Add(colDef); 
    } 
    // Adding extra column for scrollbar 
    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = (GridLength)Application.Current.Resources["DefaultListBoxScrollBarWidth"] }); 
    // </ColumnDefinition> 

    // Defines Labels 
    var iCol = 0; 
    foreach (var label in columnSpecs.Select(colSpec => new MyStackLabel { Content = colSpec.LabelTxt })) 
    { 
     Grid.SetRow(label, 0); 
     Grid.SetColumn(label, iCol); 
     grid.Children.Add(label); 
     iCol++; 
    } 

    // Block list box 
    lbxPicklist.ItemTemplate = Resources["dtplPicklist"] as DataTemplate; 
    lbxPicklist.SetBinding(MyBlockListBox.ItemsSourceProperty, new Binding("Items")); 
    var colSpan = columnSpecs.Count() + 1; 
    Grid.SetColumnSpan(lbxPicklist, colSpan); 
    } 
+1

Решение: не создавайте элементы интерфейса WPF в коде. –

+0

Вы пробовали сначала добавить Grid в окно (в коде позади) и после этого установить ItemsSource? – aKzenT

+0

Добавление небольшого примера, который воспроизводит проблему, вероятно, будет полезен. –

ответ

0

Я исправил к проблеме, установив свойство SizeToContent в Manual вместо WidthAndHeight и указан Width и Height в моем Xaml.

Смежные вопросы