Изменить содержимое кнопки в стиле? - PullRequest
16 голосов
/ 26 июня 2009

Я пытаюсь сделать что-то похожее на это:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid>
        <Button>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Content"
                            Value="No mouse over" />
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver"
                                 Value="True">
                            <Setter Property="Content">
                                <Setter.Value>
                                    <CheckBox Content="Mouse is over" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </Grid>
</Window>

Однако я получаю XamlParseException во время выполнения с сообщением:

Невозможно добавить содержимое типа 'System.Windows.Controls.CheckBox' в объект типа 'System.Object'. Ошибка на объекте «System.Windows.Controls.CheckBox

На самом деле я пытаюсь нарисовать разные значки для содержимого кнопки в зависимости от внешних условий. Так что я на самом деле пытаюсь использовать DataTrigger, но приведенный выше пример упрощает проблему. Есть идеи?

Ответы [ 4 ]

39 голосов
/ 26 июня 2009

Фактическая ошибка происходит, потому что визуальные элементы не могут быть непосредственно установлены в качестве значения Setter. Вы можете получить требуемое поведение, установив ContentTemplate с помощью DataTemplate или создав свой контент в качестве ресурса, определенного для кнопки или расположенного в другом месте.

<Button>
    <Button.Resources>
        <CheckBox x:Key="Local_MouseOverContent" Content="Mouse is over" />
    </Button.Resources>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Content" Value="No mouse over" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Content"
                            Value="{StaticResource Local_MouseOverContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Content" Value="No mouse over" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="Button">
                                <CheckBox Content="Mouse is over" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
6 голосов
/ 07 мая 2013

Замечание! Именно ваш пример работает в .NET Framework 4 без каких-либо изменений !!!!

  <Button>
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Content"
                        Value="No mouse over" />
                <Style.Triggers>
                    <Trigger Property="IsMouseOver"
                             Value="True">
                        <Setter Property="Content">
                            <Setter.Value>
                                <CheckBox Content="Mouse is over" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
2 голосов
/ 10 февраля 2010

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

0 голосов
/ 26 июня 2009

ВНИМАНИЕ: Возможно, это не лучший или правильный способ сделать это. Обязательно прочитайте и другие ответы на этой странице.

Уверен, вы захотите использовать шаблон управления в такой ситуации. Что-то вроде:


<style>
    <Setter Property="Content">
        <Setter.Value>
            <ControlTemplate>
                <Image Img="something.jpg" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</style>

И добавить шаблон управления в триггер для наведения при наведении.

Вот хорошая ссылка

...