Что означает 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?