在我的WPF应用程序中,我想在包含TabControl的可重用UserControl中动态创建TabItems。
TabControl的ItemsSource通过标准的DataBinding绑定到ObservableCollection实例。
我创建了这样的选项卡项在 InitializeComponent()
被调用之后!
// ...
int itemCount = 0;
TabItem it = null;
it = new TabItem();
it.Header = "Sicherungen + Relais";
tabItemList.Insert(itemCount++, it);
it = new TabItem();
it.Header = "Lage der Bauteile";
tabItemList.Insert(itemCount++, it);
it = new TabItem();
it.Header = "Schaltpläne";
tabItemList.Insert(itemCount++, it);
it = new TabItem();
it.Header = "Tipps + Tricks";
tabItemList.Insert(itemCount++, it);
好消息是,这些项确实被添加到TabControl中,并带有它们各自的标题。
这个问题现在发生了,当WPF试图应用一个样式到他们之后的窗口已成为可见!
我有TabItems的默认样式:
<Style TargetType="{x:Type TabItem}"
BasedOn="{StaticResource TISTabItem}">
<Setter Property="Width">
<Setter.Value>
<MultiBinding Converter="{StaticResource convCategoryTabWidthConverter}">
<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}, Mode=FindAncestor}" />
<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}, Mode=FindAncestor}"
Path="ActualWidth" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
和转换器:
public class CategoryTabWidthConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Count() < 1)
throw new ArgumentException("Values array passed is invalid.", "values");
if(values[0] == DependencyProperty.UnsetValue)
{
return 0; // Added for breakpoint. Bailing out here!!!
}
TabControl tabCtrl = values[0] as TabControl;
Double w = (tabCtrl.ActualWidth / tabCtrl.Items.Count);
w = (w <= 1) ? 0.0 : (w - 1);
return w;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
备注:我在另外两个地方使用这个转换器和样式,其中TabItems在XAML中静态添加!在这些情况下,一切都很好!
当TabItems被动态添加时,TabControl RelativeSource和它的ActualWidth的值都是DependencyProperty.UnsetValue
。
我想我在这里遇到了一些逻辑错误。
何时应用样式?在表项正确添加到内部树之前或之后?有人知道我哪里做错了吗?
我会进一步调查,并提前感谢大家的帮助。
自己解决了。问题是我忘记了ItemsSource的元素将被包装到TabItem实例中。
TabItem中的TabItem实际上没有意义。
直接插入到TabControl中。