Что означает x: Key = "{x: Type TextBox}" делать?
все в заголовке:
Я читал не один раз, задавая такой стиль:
<Style TargetType="TextBox">...</Style>
был примерно эквивалентен:
<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style>
(последний раз в комментарии по другому вопросу)
оба должны применять стиль ко всем текстовым полям в приложении (если они, конечно, помещены в ресурсы приложения)
но я попробовал оба в моих приложениях, и работает только второй с установленным x: Key.
это кажется вполне логичным для меня, поскольку первый не знает, где будет применяться без какого-либо свойства x: Key, но тогда какая точка первого синтаксиса?
Изменить: пример кода в моем приложении, который отлично работает:
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
и код, который не имеет значения:
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
Я написал это, чтобы избавиться от проблем с привязкой, которые вы получаете с помощью comboBoxItems, когда вы манипулируете существующими компонентами ComboBox. И первый код работает нормально, а второй - нет.
вы можете легко это увидеть, установив для параметра horizontalContentAlignment вправо
Изменить 2: Этот код просто помещается в словарь ресурсов в моем App.xaml. И замена TargetType = "{x: Тип ComboBoxItem}" с TargetType = "ComboBoxItem" не имеет никакого значения
Изменить 3: Я просто понял, что забыл уточнить что-то важное (извините за это): хотя стили определены в xaml, я фактически добавляю элементы управления в макет в моем коде поскольку они добавляются динамически. Может быть, где проблема...
Ответы
Ответ 1
Как показано в первом примере выше, установка свойства TargetType TextBlock без назначения стиля с x: ключ позволяет вашему стилю быть применяется ко всем элементам TextBlock. Что на самом деле происходит, так это то, что неявно устанавливает x: Ключ к {x: Тип TextBlock}. Это также означает, что если вы придаете стилю значение x: Key ничего, кроме {x: Тип TextBlock}, стиль не будет применяется ко всем элементам TextBlock автоматически. Вместо этого вам нужно применить стиль к TextBlock элементов явно.
Учитывая, что это из официальной документации, ваша проблема должна быть аномалией. Я видел несколько таких странностей, и они не слишком неожиданны, поскольку кодирование за WPF неизбежно будет несовершенным.
(Есть ли разница в результатах между TargetType="ComboBoxItem"
и TargetType="{x:Type ComboBoxItem}"
, если ключ опущен?)
Ответ 2
Теперь вы можете каскадировать свои стили, добавив:
BasedOn="{StaticResource {x:Type ComboBox}}"
в < Style/ > далее вниз по документу, например:
<Window.Resources>
<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</Window.Resources>
<StackPanel>
<TextBox>I'm Left-Center</TextBox>
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="HorizontalContentAlignment" Value="Right"/>
</Style>
<Grid.Resources>
<TextBox>I'm Right-Center</TextBox>
</Grid>
</StackPanel>
Ответ 3
Каждому ресурсу нужен ключ, но если Key
опущен для стиля, он должен по умолчанию указывать тип TargetType
. Поэтому оба ваших фрагмента выше должны быть эквивалентными.
Можно ли разместить весь код, где он не работает, без явного определения Key
?