ItemContainerStyle, переопределяющий общий стиль
Я ссылаюсь на ExpressionDark.xaml из моего App.xaml, который работает нормально, однако, когда я пытаюсь использовать ItemContainerStyle в ItemsControl, элементы в 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.
ТИА
2 ответа
Если вы укажете стиль "на месте", он будет считаться совершенно новым стилем. В связи с этим стиль по умолчанию из ExpressionDark.xaml для этого элемента забыт.
Что нужно сделать, чтобы избежать этого: Обратитесь к базовому стилю с BasedOn=
<ItemsControl.ItemContainerStyle>
<Style BasedOn="{StaticResource Existing}">
<Setter Property="Margin" Value="5" />
</Style>
</ItemsControl.ItemContainerStyle>
Найдите соответствующий стиль по умолчанию для вашего контроля. И заменить Existing
с ключом ресурса из ExpressionDark.xaml. Вы можете идентифицировать это, потому что у этого будет надлежащее TargetType
набор свойств:
<Style TargetType="{x:Type ListBoxItem}"> x:Key=...
Где ListBoxItem - ваш используемый элемент управления (для рестайлинга)
Вы можете рассмотреть возможность использования ListBox
вместо ItemsControl
как есть ListBoxItem
как контейнер.
То, как вы используете поле, хорошо, но когда вы используете другой стиль, App.xaml
, он не будет использовать один в App.xaml
,
Это то, как он работает в WPF, элемент управления использует стиль, "наиболее близкий к нему", и, поскольку вы записываете этот стиль непосредственно в элемент управления, он использует этот стиль.
Вы можете сделать новый стиль в app.xaml
со свойством BaseOn, основанным на ExpressionDark.xaml
, но вы добавите:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Margin" Value="5" />
</Style>
</ItemsControl.ItemContainerStyle>