2013-06-18 8 views
6

W mojej aplikacji okna WPF, gdy przejdę po przycisk myszy, obraz tła na przycisku zniknie, a przycisk pojawi się tak, jakby nie miał żadnego obrazu. Czego chcę, gdy mysz znajduje się na przycisku lub gdy kliknięty jest przycisk, obraz powinien być nadal widoczny na przycisku, nie powinien znikać.Obraz w tle na przycisku znika na myszy ponad

Proszę o pomoc.

Dzięki

+1

masz jakiekolwiek eventtriggers lub kod związany, które mogą zmienić obraz? –

+0

Nie. Obraz na przycisku nie zmieni się z żadnego miejsca. Podaję obraz w Xaml w czasie projektowania. Ale jeśli muszę zmienić obraz na wyzwalaczach, to nie ma problemu, ja też to zrobię. – WAQ

+0

Czy umieścisz swój kod? Tworzenie przycisku i przycisku stylu. – Sonhja

Odpowiedz

8

To, co się z tobą dzieje, jest normalne. Gdy utworzysz przycisk, użyje on jego domyślnych właściwości na wypadek, gdybyś go nie zmienił/nie zmienił.

W takim przypadku po utworzeniu przycisku zastępujesz właściwość Background, ale tylko w przypadku normalnego stanu przycisku. Jeśli chcesz, aby tło zmieniało się również po najechaniu kursorem, powinieneś powiedzieć przycisk, aby to zrobić.

W tym celu proponuję zastąpić szablon przycisk użyciu stylów, takich jak to:

<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> 

W tym przypadku, ten styl będzie stosowany do wszystkich przycisków. Można określić, który przycisk, aby zastosować styl dodając x:Key do swojego stylu, a następnie podać go w przycisku:

<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

Użyłem podanego kodu. Działa świetnie, jeśli nie podam tego x: key = "ButtonStyled". Wszystkie przyciski mają stylowe zachowanie. Kiedy jednak podaję wymagany przycisk Style = "ButtonStyled", otrzymuję wyjątek mówiąc "Ustaw właściwość" System.Windows.FrameworkElement.Style "rzucił wyjątek". Masz pomysł? – WAQ

+1

@WasimQadir powinno to być 'Style =" {StaticResource ButtonStyled} "' – lisp

+0

@lisp Wielkie dzięki. To zadziałało :) – WAQ

2

Jestem trochę późno do partii, ale wszyscy robią to zbyt skomplikowane.

Wszystko co musisz zrobić, to ustawić zawartość i tło:

<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

To dodaje kolejną Kontrolę wewnątrz Przycisku, ale to jest o wiele lepsze! Dzięki, użyję tego! – Sree