2013-02-19 23 views
0

我有一個ResourceDictionary,它包含我的應用程序中使用的控件的樣式定義。當DataTemplate動態構建時窗口樣式不被應用

所有樣式都適用於窗口中的控件。

在一個特定的情況下,我需要通過代碼(在代碼後面)動態構建DataTemplate和Grid。當我的控件顯示時,所有項目和數據都能正確顯示,但似乎Style不適用。當我點擊我的屏幕邊框來調整大小時,該風格將在此特定時刻應用。

爲什麼?當顯示控件時,我能做些什麼來應用樣式?

編輯 這裏是我的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 UI元素。 – 2013-02-19 17:52:16

+0

您是否嘗試過先將網格添加到窗口(在代碼後面),然後設置ItemsSource? – aKzenT 2013-02-19 17:55:21

+0

添加一個重現問題的小例子可能會有所幫助。 – 2013-02-19 18:59:28

回答

0

我固定的問題由酒店SizeToContent設置爲Manual,而不是WidthAndHeight和指定的我的Xaml中的WidthHeight

相關問題