Почему вторая кнопка не проявляется, если она имеет тот же стиль, что и первая?

Почему при попытке создать несколько кнопок с одинаковым стилем в одном окне отображается только одна из них? Я пробовал присваивать кнопкам разные имена, но это не решило проблему. В данный момент я дублирую стиль с другим ключом, но мне нужно создать семь кнопок в одном месте. Есть ли какое-либо эффективное решение для этой задачи? 

Вот пример кнопки:
<pre><code class="xml">&lt;Button Style="{StaticResource ButtonClearStyle}"
        Command="{Binding ClearSelectedCommand}" /&gt;</code></pre>

И сам стиль:
<pre><code class="xml">&lt;Style x:Key="ButtonClearStyle" TargetType="{x:Type Button}"&gt;
    &lt;Setter Property="Background" Value="Transparent" /&gt;
    
    &lt;Setter Property="Content"&gt;
        &lt;Setter.Value&gt;
            &lt;Path HorizontalAlignment="Center"
                  VerticalAlignment="Center"
                  Height="10"
                  Width="10"
                  Margin="7"
                  Data="{StaticResource Clear}"
                  Fill="Red"
                  Stretch="Fill" /&gt;
        &lt;/Setter.Value&gt;
    &lt;/Setter&gt;
    &lt;Setter Property="Template"&gt;
        &lt;Setter.Value&gt;
            &lt;ControlTemplate TargetType="{x:Type Button}"&gt;
                &lt;Border Background="{TemplateBinding Background}"
                        BorderBrush="{x:Null}"
                        BorderThickness="0"&gt;
                    &lt;ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /&gt;
                &lt;/Border&gt;
            &lt;/ControlTemplate&gt;
        &lt;/Setter.Value&gt;
    &lt;/Setter&gt;</code></pre>

А также:
<pre><code class="xml">&lt;PathGeometry x:Key="Clear"
              Figures="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,
  • 9 декабря 2024 г. 7:53
Ответы на вопрос 1
Проблема, с которой вы столкнулись, связана с тем, что в вашем стиле используется свойство `Content`, для которого задан `Setter.Value`. Когда вы присваиваете один и тот же стиль нескольким кнопкам, они будут пытаться отобразить один и тот же объект `Path`, так как все они ссылаются на один и тот же ресурс.

В WPF (Windows Presentation Foundation) ресурсы, такие как `Path` в вашем случае, по умолчанию создаются как синглтоны — единственный экземпляр, который переписывается в каждой кнопке. Когда вы используете один и тот же объект для `Content`, результатом будет показ только одного элемента.

### Решение:
Чтобы решить эту проблему, вы можете сделать следующее:

1. **Используйте `ContentTemplate`:** вместо использования `Setter` для свойства `Content`, вы можете задать `ControlTemplate` для кнопки и использовать `ContentPresenter`, чтобы содержимое кнопки оставалось уникальным. Просто не определяйте `Content`, а пусть кнопка принимает свое собственное содержимое.

```xml
<Style x:Key="ButtonClearStyle" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="{x:Null}" BorderThickness="0">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
```

2. **Создайте разные объекты для каждой кнопки:** Если вы все же хотите использовать `Setter` и `Path`, то вам придется создать разные экземпляры `Path` для каждой кнопки. Вы можете добиться этого через стиль без указания значения `Content` и создавать кнопки в коде или XAML как:

```xml
<Button Style="{StaticResource ButtonClearStyle}" Command="{Binding ClearSelectedCommand}">
    <Path HorizontalAlignment="Center" VerticalAlignment="Center" Height="10" Width="10" Margin="7" Data="{StaticResource Clear}" Fill="Red" Stretch="Fill"/>
</Button>

<Button Style="{StaticResource ButtonClearStyle}" Command="{Binding ClearSelectedCommand}">
    <Path HorizontalAlignment="Center" VerticalAlignment="Center" Height="10" Width="10" Margin="7" Data="{StaticResource Clear}" Fill="Red" Stretch="Fill"/>
</Button>
```

3. **Используйте `DataTemplate`:** Если вы хотите создать динамически несколько кнопок и у каждой должен быть свой собственный `Path`, вы можете использовать `ItemsControl` и `DataTemplate`.

Пример:

```xml
<ItemsControl ItemsSource="{Binding YourItemsSource}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Style="{StaticResource ButtonClearStyle}" Command="{Binding ClearSelectedCommand}">
                <Path HorizontalAlignment="Center" VerticalAlignment="Center" Height="10" Width="10" Margin="7" Data="{StaticResource Clear}" Fill="Red" Stretch="Fill"/>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
```

Эти подходы помогут вам создать несколько кнопок с одинаковым стилем, не теряя при этом уникальность их содержимого.
Похожие вопросы