2009-01-21 4 views
8

J'ai un modèle de données avec une zone de texte et un bouton avec quelques styles dessus. Je voudrais que le bouton affiche l'état de la souris lorsque l'accent est mis sur la zone de texte à côté. Est-ce possible?Est-ce que simuler un passage de souris WPF est possible?

Je pense que cela impliquerait quelque chose comme ça. Je peux obtenir la zone de texte en utilisant FindVisualChild et FindName. Ensuite, je peux définir l'événement GotFocus sur la zone de texte pour faire quelque chose.

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus); 

Ici, dans TB_GotFocus, je suis bloqué. Je peux obtenir le bouton que je veux montrer à la souris sur l'état de, mais je ne sais pas quel événement pour l'envoyer. MouseEnterEvent n'est pas autorisé.

void TB_GotFocus(object sender, RoutedEventArgs e) 
    { 
    ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(this.DataTemplateInstance); 
    DataTemplate template = myContentPresenter.ContentTemplate; 

    Button _button= template.FindName("TemplateButton", myContentPresenter) as Button; 
    _button.RaiseEvent(new RoutedEventArgs(Button.MouseEnterEvent)); 

    } 
+0

Pouvez-vous poster votre modèle de contrôle pour que nous puissions voir? –

Répondre

2

Je ne pense pas qu'il soit possible de simuler l'événement, mais vous pouvez forcer le bouton pour se rendre comme si elle avait MouseOver.

private void tb_GotFocus(object sender, RoutedEventArgs e) 
{ 
    // ButtonChrome is the first child of button 
    DependencyObject chrome = VisualTreeHelper.GetChild(button, 0); 
    chrome.SetValue(Microsoft.Windows.Themes.ButtonChrome.RenderMouseOverProperty, true); 
} 

private void tb_LostFocus(object sender, RoutedEventArgs e) 
{ 
    // ButtonChrome is the first child of button 
    DependencyObject chrome = VisualTreeHelper.GetChild(button, 0); 
    chrome.ClearValue(Microsoft.Windows.Themes.ButtonChrome.RenderMouseOverProperty); 
} 

vous devez faire référence PresentationFramework.Aero.dlll pour que cela fonctionne et il ne fonctionne que sur Vista pour le thème Aero.

Si vous voulez que cela fonctionne pour d'autres thèmes, vous devez créer un modèle de contrôle personnalisé pour chacun des thèmes que vous voulez prendre en charge.

Voir http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx pour obtenir des conseils

+0

Cela fonctionnerait pour la plupart des gens que je suspecte, mais j'utilise un modèle de bouton personnalisé pour que le thème Windows par défaut ne fonctionne pas pour moi. – Jippers

0

En guise de suivi au commentaire de jesperll, je pense que vous pouvez contourner faire un modèle personnalisé pour chaque thème en réglant dynamiquement le style à celui que vous voulez/null.

Voici ma fenêtre, avec le style défini (mais pas défini sur quoi que ce soit).

<Window x:Class="WpfApplication.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WpfApplication" 
Title="Window1" Height="300" Width="300"> 

<Window.Resources> 
    <Style TargetType="{x:Type Button}" x:Key="MouseOverStyle"> 
     <Setter Property="Background"> 
      <Setter.Value>Green</Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid Height="30"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <TextBox x:Name="MyTextBox" Grid.Column="0" Text="Some Text" Margin="2" GotFocus="TextBox_GotFocus" LostFocus="MyTextBox_LostFocus"/> 
    <Button x:Name="MyButton" Grid.Column="1" Content="Button" Margin="2" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave" /> 
</Grid> 

Au lieu de définir le style via des déclencheurs dans le modèle, vous pouvez utiliser des événements dans votre fichier .cs comme ceci:

...

public partial class Window1 : Window 
{ 
    Style mouseOverStyle; 
    public Window1() 
    { 
     InitializeComponent(); 
     mouseOverStyle = (Style)FindResource("MouseOverStyle"); 
    } 
    private void TextBox_GotFocus(object sender, RoutedEventArgs e) { MyButton.Style = mouseOverStyle; } 
    private void MyTextBox_LostFocus(object sender, RoutedEventArgs e) { MyButton.Style = null; } 
    private void Button_MouseEnter(object sender, MouseEventArgs e) { ((Button)sender).Style = mouseOverStyle; } 
    private void Button_MouseLeave(object sender, MouseEventArgs e) { ((Button)sender).Style = null; } 
} 

Vous obtenez une référence au style dans le constructeur, puis l'initialise/désactive dynamiquement. De cette façon, vous pouvez définir ce à quoi vous voulez que votre style ressemble dans Xaml, et vous ne devez pas compter sur de nouvelles dépendances.

Questions connexes