2013-06-18 7 views
6

Nella mia applicazione finestra WPF, quando si passa il mouse sopra il mio pulsante, l'immagine di sfondo sul pulsante scompare e il pulsante appare come se non avesse alcuna immagine. Quello che voglio è, quando il mouse è sul pulsante, o quando si fa clic sul pulsante, l'immagine deve ancora essere mostrata sul pulsante, non dovrebbe sparire.l'immagine di sfondo su un pulsante scompare con il mouse su

Per favore aiuto.

Grazie

+1

Avete Eventtriggers o codice dietro che potrebbe cambiare l'immagine? –

+0

No. L'immagine sul pulsante non cambierà da nessuna parte. Sto specificando l'immagine in Xaml in fase di progettazione. Ma se devo cambiare l'immagine sui grilletti, nessun problema, lo farò anch'io. – WAQ

+0

Puoi pubblicare il tuo codice? Creazione di pulsanti e stili di stile. – Sonhja

risposta

8

Quello che ti sta succedendo è normale. Quando crei un pulsante, utilizzerà le sue proprietà predefinite nel caso in cui tu non lo modifichi/sovrascruisci.

In questo caso, quando si crea il pulsante, si sostituisce la proprietà Background, ma solo per lo stato normale del pulsante. Se vuoi che lo sfondo cambi anche quando stai passando il mouse, dovresti dire al pulsante di farlo.

A tale scopo, suggerisco di ignorare il pulsante Modello utilizzando gli stili, in questo modo:

<Window x:Class="ButtonTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ImageBrush x:Key="ButtonImage" ImageSource="/ButtonTest;component/Resources/ok.png"></ImageBrush> 
    <Style TargetType="Button"> 
     <Setter Property="Background" Value="{StaticResource ButtonImage}"></Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Foreground" Value="Blue" /> 
          <Setter Property="Cursor" Value="Hand" /> 
          <!-- If we don't tell the background to change on hover, it will remain the same --> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="84,75,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 
</Grid> 
</Window> 

In questo caso, sarà applicato questo stile per tutti i pulsanti. È possibile specificare quale pulsante per applicare lo stile aggiungendo un x:Key al vostro stile e quindi specificare nel vostro pulsante:

<Style TargetType="Button" x:Key="ButtonStyled"> 

..... 

<Button Style="{StaticResource ButtonStyled}" Content="Button" Height="23" HorizontalAlignment="Left" Margin="84,75,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 
+0

Ho usato il codice che hai fornito. Funziona alla grande se non lo do x: key = "ButtonStyled". Tutti i pulsanti ottengono il comportamento in stile. Ma quando do il mio pulsante richiesto Style = "ButtonStyled", ottengo un'eccezione che dice "Imposta proprietà" System.Windows.FrameworkElement.Style "ha generato un'eccezione". Qualche idea su questo? – WAQ

+1

@WasimQadir dovrebbe essere 'Style =" {StaticResource ButtonStyled} "' – lisp

+0

@lisp Molte grazie ragazzi. Ha funzionato :) – WAQ

2

Sono un po 'in ritardo alla festa, ma siete tutti facendo questo troppo complicato.

Tutto quello che dovete fare è impostare il contenuto e lo sfondo:

<Button x:Name="YouTubeButton" Width="148" Height="76" BorderBrush="Black" 
    Click="YouTubeButton_Click" Margin="112,20,112,0" 
    MouseEnter="Button_OnMouseEnter" MouseLeave="Button_MouseLeave"> 
    <Button.Content> 
     <Image Source="Images/YouTube.png" /> 
    </Button.Content> 
    <Button.Background> 
     <ImageBrush ImageSource="Images/YouTube.png" /> 
    </Button.Background> 
</Button> 

(Optional - makes the mouse behave like a hand clicking a link) 
#region Button_MouseLeave(object sender, MouseEventArgs e) 
/// <summary> 
/// This event is fired when the mouse leaves a button 
/// </summary> 
private void Button_MouseLeave(object sender, MouseEventArgs e) 
{ 
    // Change the cursor back to default 
    Cursor = null; 
} 
#endregion 

#region Button_OnMouseEnter(object sender, EventArgs e) 
/// <summary> 
/// This event is fired when the mouse hovers over a button 
/// </summary> 
public void Button_OnMouseEnter(object sender, EventArgs e) 
{ 
    // Change the cursor to a Hand pointer 
    Cursor = Cursors.Hand; 
} 
#endregion 
+0

Questo aggiunge un altro controllo all'interno del pulsante, ma questo è molto meglio! Grazie, lo userò! – Sree