Создание настраиваемой кнопки «по умолчанию» в Expression Blend + WPF - PullRequest
0 голосов
/ 19 декабря 2010

Я на 95% пути к тому, чтобы получить то, что мне нужно, но все еще есть некоторые проблемы. По сути, я бы хотел, чтобы стиль по умолчанию для всех элементов управления Button (использованный при перетаскивании Button на форму с помощью Expression Blend) вел себя так, как показано ниже:

При наведении мыши - изменить цвет шрифта кнопки на градиент И увеличить размер шрифта на 2 пункта больше, чем размер шрифта, назначенный элементу управления в его «нормальном» состоянии. Увеличение размера важно, поскольку у «кнопок» нет границ, это просто текст с тенью.

При нажатии - снова измените цвет шрифта, удалите тень, чтобы она выглядела подавленной (размер все равно останется «обычным» размером шрифта + 2 балла)

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

Я бы предпочел бы не иметь полностью настраиваемый элемент управления Button (например, "CustomButton") и просто переопределить внешний вид / стиль обычного элемента управления "Button" по умолчанию, поскольку это будет единственный тип кнопка в приложении. Но если новый класс / контроль - единственный способ, я вместо этого попробую.

Ex.

<Button Content="Button1"/>
<Button Content="Button2" FontSize="18"/>
<Button Content="Button3" FontSize="24"/>

При наведении курсора размер шрифта должен быть на +2 больше, чем назначенный размер каждой кнопки. Сейчас я делаю это, накладывая текстовый блок поверх реального текста кнопки (с несколькими привязками), но он пока не совсем работает.

1 Ответ

2 голосов
/ 19 декабря 2010

Если я правильно вас понимаю, вы задаете два вопроса здесь:

  1. Как изменить внешний вид кнопки на MouseOver
  2. Как автоматически применить это ко всем кнопкам

Относительно # 1: Нет необходимости в специализированном пользовательском элементе управления - самый простой способ сделать это в WPF - использовать стиль (с триггером свойства для IsMouseOver).

Что касается # 2: Сделав ваш стиль ресурсом без ключа (без указания ключа ресурса), он будет применен ко всем элементам управления в области видимости, соответствующему целевому типу.

Вот пример стиля, который вы можете поместить в окна или приложения.ресурсы:

<Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                     Value="True">
                <Setter Property="RenderTransform">
                    <Setter.Value>
                        <ScaleTransform ScaleX="1.05" ScaleY="1.05"/>
                    </Setter.Value>
                </Setter>
                <Setter Property="Foreground">
                    <Setter.Value>
                        <LinearGradientBrush>
                            <GradientStop Color="CornflowerBlue"
                                          Offset="0"/>
                            <GradientStop Color="DarkSlateBlue"
                                          Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
        <Setter Property="RenderTransformOrigin"
                Value=".5,.5"/>
    </Style>

Обратите внимание, что этот стиль не увеличит размер шрифта на 2 - вместо этого он масштабирует всю кнопку на 5%.Это действительно может быть лучшим (и более простым) решением того, что вы имеете в виду.Если вам абсолютно необходимо увеличить относительный размер шрифта (вместо назначения абсолютного, нового размера шрифта), это немного сложнее, но это тоже можно сделать.

...