2010-10-04 4 views
62

Моя проблема заключается в том, что в WPF всякий раз, когда я пытаюсь изменить цвет фона кнопки с помощью триггеров или анимаций, эффект mouseover по умолчанию (быть серым с этим оранжевым свечением), по-видимому, имеет приоритет.Как удалить эффект по умолчанию мыши на кнопки WPF?

После подробных поисков я не знаю, как удалить этот эффект.

ответ

16

Вам необходимо создать свой собственный шаблон кнопки, чтобы иметь полный контроль над внешним видом во всех состояниях. Вот tutorial.

+2

Спасибо, что было идеально. Это было сложнее, чем я думал, но все работает хорошо. – Nellius

+1

Почему-то 100 ответов о создании пользовательских шаблонов для элементов управления WPF, и все они излишне ошибочны. Нет причин бороться с тем, чтобы написать 50 строк кода шаблона для кнопки, чтобы изменить 1 вещь. Все, что вам нужно сделать, это в дизайнере xaml щелкнуть правой кнопкой мыши элемент управления и создать копию кода шаблона. VS создаст стиль с этой точной кнопки, и вы сможете настроить его там. Занимает буквально 2 секунды. –

84

Это похоже на решение, упомянутое Марк Хит, но не так много кода, чтобы просто создать очень базовую кнопку без встроенной мыши над эффектом анимации. Он сохраняет простую мышь над эффектом отображения границы кнопки в черном. Стиль можно вставить в раздел Window.Resources или UserControl.Resources, например (как показано).

<UserControl.Resources> 
     <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect --> 
     <Style x:Key="MyButtonStyle" TargetType="Button"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Setter Property="Margin" Value="5"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border Name="border" 
          BorderThickness="1" 
          Padding="4,2" 
          BorderBrush="DarkGray" 
          CornerRadius="3" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="border" Property="BorderBrush" Value="Black" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 

<!-- usage in xaml --> 
<Button Style="{StaticResource MyButtonStyle}">Hello!</Button> 
+1

Мне это очень нравится. Однако мышь над триггерами активируется только тогда, когда мышь над текстом на кнопке. Я добавил текстовый блок с указанной шириной внутри кнопки, чтобы исправить эту проблему. – Dave

2

Если кто-то не хочет переопределять шаблон управления по умолчанию, то вот решение.

Вы можете создать DataTemplate для кнопки, которая может иметь TextBlock, а затем вы можете написать Property trigger на свойстве IsMouseOver, чтобы отключить эффект мыши. Высота TextBlock и Button должна быть одинаковой.

<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20"> 
        <Button.ContentTemplate> 
         <DataTemplate> 
          <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20"> 
           <TextBlock.Style> 
            <Style TargetType="TextBlock"> 
             <Style.Triggers> 
              <Trigger Property ="IsMouseOver" Value="True"> 
               <Setter Property= "Background" Value="Black"/> 
              </Trigger> 
             </Style.Triggers> 
            </Style> 
           </TextBlock.Style> 
          </TextBlock> 
         </DataTemplate> 
        </Button.ContentTemplate> 
       </Button> 
1

Расширение на ответ dodgy_coder, который добавляет поддержку ..

  • Поддержание WPF стиль кнопки
  • Добавлена ​​поддержка IsSelected и парить, т.е. переключаемых кнопкой

    <Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type ButtonBase}"> 
            <Border Name="border" 
              BorderThickness="{TemplateBinding BorderThickness}" 
              Padding="{TemplateBinding Padding}" 
              BorderBrush="{TemplateBinding BorderBrush}" 
              Background="{TemplateBinding Background}"> 
             <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
            </Border> 
            <ControlTemplate.Triggers> 
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="True" /> 
               <Condition Property="Selector.IsSelected" Value="False" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="#FFBEE6FD" /> 
             </MultiTrigger> 
    
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="True" /> 
               <Condition Property="Selector.IsSelected" Value="True" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="#BB90EE90" /> 
             </MultiTrigger> 
    
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="False" /> 
               <Condition Property="Selector.IsSelected" Value="True" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="LightGreen" /> 
             </MultiTrigger> 
    
             <Trigger Property="IsPressed" Value="True"> 
              <Setter TargetName="border" Property="Opacity" Value="0.95" /> 
             </Trigger> 
            </ControlTemplate.Triggers> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
    

примеры ..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />

0

Использование шаблона триггера:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Background" Value="White"></Setter> 
    ... 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="White"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
14

Просто, чтобы добавить очень простое решение, это было достаточно хорошо для меня, и я думаю, что вопрос адресуется к OP еще. Я использовал решение in this answer, за исключением обычного значения Background вместо изображения. не

<Style x:Key="SomeButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid Background="{TemplateBinding Background}"> 
        <ContentPresenter /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Нет повторно шаблонный за заставляя Background всегда быть Transparent фон с помощью кнопки шаблонного - Mouseover больше не влияет на фон, как только это будет сделано. Очевидно, замените Transparent на любое предпочтительное значение.

0

У Muffin Man был очень простой ответ, который работал на меня.

Чтобы добавить немного более конкретное направление, по крайней мере, для VS 2013:

  • правой кнопкой мыши элемент управления
  • Выберите Edit Template => Редактировать копию ...
  • Я выбрал «Application» для того, где сохранить стиль
    • Здесь вы можете напрямую редактировать app.xaml и увидеть интуитивно названные свойства. Для моих целей, я просто установить RenderMouseOver = «False»
  • Затем в MainWindow.xaml или где ваш графический интерфейс, вы можете вставить новый стиль в конце тега Button, например, ... Style="{DynamicResource MouseOverNonDefault}"/>
+0

Кто такой сфинк? – mjwatts

+0

LOL. Он сделал второй ответ на принятый вопрос-ответ. Не был уверен, что вы спрашиваете серьезно или шутите. Трудно сказать с таким именем, как Muffin Man. –