1

我从我的 App.xaml 中引用 ExpressionDark.xaml,它工作正常,但是当我尝试在 ItemsControl 中使用 ItemContainerStyle 时,ItemsControl 中的项目恢复为基本样式。

<ItemsControl Grid.Column="1" VerticalAlignment="Center" Margin="10">
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Margin" Value="5" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.Items>
        <TextBlock Text="{Binding Error}" />
        <TextBox Text="{Binding Path=Username,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" Validation.ErrorTemplate="{StaticResource validationTemplate}"></TextBox>
        <TextBox Text="{Binding Path=Password,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" Validation.ErrorTemplate="{StaticResource validationTemplate}"></TextBox>
        <Button VerticalAlignment="Center" HorizontalAlignment="Right" Command="{Binding SignInCommand}" IsEnabled="{Binding CanSignIn}" Content="Sign In"></Button>
        <TextBox Text="{Binding Path=Username}"></TextBox>
    </ItemsControl.Items>
</ItemsControl>

我只是想为垂直样式找到一个好的控件(轻松地在项目之间添加边距),所以也许有一种更好的方法不会覆盖 App.xaml 中指定的样式。

TIA

4

2 回答 2

2

如果您指定“就地”样式,则将其视为全新样式。由于ExpressionDark.xaml中的默认样式被忘记用于该元素。

为了避免这种情况,您必须做的是:使用 BasedOn= 参考基本样式

<ItemsControl.ItemContainerStyle>
   <Style BasedOn="{StaticResource Existing}">
      <Setter Property="Margin" Value="5" />
   </Style>
</ItemsControl.ItemContainerStyle>

为您的控件找到相应的默认样式。并用ExpressionDark.xamlExisting中的 Resource-Key替换。您可以识别它,因为它将具有正确的属性集:TargetType

<Style TargetType="{x:Type ListBoxItem}"> x:Key=...

ListBoxItem 是您正在使用的控件(要重新设置样式)

您可以考虑使用ListBox而不是ItemsControlListBoxItem容器那样使用。

于 2014-06-20T07:56:26.580 回答
0

他们使用边距的方式很好,但是当您使用App.xamlApp.xaml.

这是它在 WPF 中的工作方式,控件使用与其“最接近”的样式,并且由于您将此样式直接写入控件,因此它使用该样式。

您可以在app.xaml'BaseOn' 属性的基础上创建新样式ExpressionDark.xaml,但您将添加:

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Margin" Value="5" />
    </Style>
</ItemsControl.ItemContainerStyle>
于 2011-01-05T23:14:50.963 回答