Настроить содержимое кнопки в стиле

19

У меня есть кнопка WPF, определенная следующим образом:

<Button Style="{StaticResource RevertButtonStyle}" />

вот как выглядит стиль:

<Style x:Key="RevertButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Height" Value="25" />
    <Setter Property="Width" Value="20" />
    <Setter Property="Margin" Value="3,0,0,0" />
</Style>

Как изменить стиль, чтобы указать Content для использования изображения с именем «revert.png»?

Спасибо,

    
задан sean717 31.08.2011 в 00:53
источник

2 ответа

29

Вы не можете использовать свойство Content для экземпляра элемента управления Image , так как тогда изображение может использоваться более чем одной кнопкой. Это приведет к тому, что исключение «visual is is a child of another visual».

Вместо этого вы можете использовать DataTemplate следующим образом:

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Image Source="revert.png" />
        </DataTemplate>
    </Setter.Value>
</Setter>

Очевидно, вам может потребоваться настроить исходный URI изображения.

    
ответ дан CodeNaked 31.08.2011 в 01:09
  • работал как шарм. Благодарю. –  sean717 31.08.2011 в 01:12
  • Это сразу помогло мне - у меня было исключение «visual is ... ...» с Path, который я задавал в качестве содержимого кнопки в стиле. Благодарю. –  Pieter Müller 14.10.2011 в 17:16
3

В моем приложении я определил элемент управления ImageButton , который определяет свойство ImageSource .

Это выглядит так:

<Style TargetType="{x:Type controls:ImageButton}">
    <Setter Property="ForceCursor" Value="True" />
    <Setter Property="Cursor" Value="Hand" />

    <Setter Property="ToolTip" Value="{Binding Path=Caption, RelativeSource={RelativeSource Mode=Self}}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:ImageButton}">
                <Image Width="16" Height="16" Source="{Binding Path=ImageSource, RelativeSource={RelativeSource Mode=TemplatedParent}}" Name="image" />

                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="image" Property="Opacity" Value="0.3" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Но в вашем случае, если вы хотите использовать одно и то же изображение для всех Button объектов с определенным набором Style , вы можете просто просто использовать <Image Source="pack://application:,,,/My.Assembly.Name;component/Icons/revert.png" /> в Template , если изображение, которое вы хотите использовать был включен как ресурс в приложении.

    
ответ дан fatty 31.08.2011 в 01:03
  • thx, но это не получилось очень хорошо. Пожалуйста, см. Сообщение CodeNaked. –  sean717 31.08.2011 в 01:14
  • Прости, да, я оговорился. Должен был ContentTemplate (как и в дампе кода, который я опубликовал), а не Content, как в моем исходном сводке. Редактировал для будущих зрителей. –  fatty 31.08.2011 в 01:16