2009-01-21 13 views
8

Ich habe eine Datenvorlage mit einem Textfeld und einer Schaltfläche mit einigen Stilen darauf. Ich möchte, dass die Schaltfläche den Mauszeiger über den Status zeigt, wenn der Fokus auf der Textbox daneben liegt. Ist das möglich?Ist es möglich, einen WPF-Mouseover zu fälschen?

Ich denke, es würde so etwas beinhalten. Ich kann das Textfeld durch Verwendung von FindVisualChild und FindName abrufen. Dann kann ich das GotFocus-Ereignis in der Textbox einstellen, um etwas zu tun.

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus); 

Hier in TB_GotFocus stecke ich fest. Ich kann den Knopf bekommen, mit dem ich die Maus über den Zustand von zeigen möchte, aber ich weiß nicht, welches Ereignis zu ihm gesendet werden soll. MouseEnterEvent ist nicht erlaubt.

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

Können Sie Ihre Kontrollvorlage für uns veröffentlichen? –

Antwort

2

Ich glaube nicht, dass das Ereignis zu fälschen möglich ist, aber wenn Sie die Taste selbst zu machen, zwingen können als ob es Mouseover hatte.

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); 
} 

müssen Sie PresentationFramework.Aero.dlll für diese zu arbeiten und dann wird es nur funktionieren, auf Vista für das Aero-Design verweisen.

Wenn Sie möchten, dass es für andere Themen funktioniert, sollten Sie für jedes Thema, das Sie unterstützen möchten, eine benutzerdefinierte Kontrollvorlage erstellen.

Siehe http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx für Tipps

+0

Das würde für die meisten Leute funktionieren, die ich vermute, aber ich benutze eine benutzerdefinierte Schaltflächenvorlage, so dass das Standard-Windows-Thema für mich nicht funktioniert. – Jippers

0

Als zu jesperll Kommentar des Follow-up, ich glaube, Sie für jedes Thema umgehen, können Sie durch dynamisch ein eigenes Template zu machen Einstellung des Stils in die ein/null wollen.

Hier ist mein Fenster, mit dem Stil definiert (aber nicht auf etwas festgelegt).

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

Statt den Stil über Trigger in der Vorlage der Einstellung können Sie Ereignisse in Ihrer CS- wie so Datei:

...

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

Sie erhalten eine Referenz auf den Stil im Konstruktor und dann dynamisch setzen/deaktivieren. Auf diese Weise können Sie festlegen, wie Ihr Stil in Xaml aussehen soll, und Sie müssen sich nicht auf neue Abhängigkeiten verlassen.

Verwandte Themen