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);
}
解決方案:不要在代碼中創建WPF UI元素。 – 2013-02-19 17:52:16
您是否嘗試過先將網格添加到窗口(在代碼後面),然後設置ItemsSource? – aKzenT 2013-02-19 17:55:21
添加一個重現問題的小例子可能會有所幫助。 – 2013-02-19 18:59:28