2009-01-21 13 views
8

Mam szablon danych z polem tekstowym i przycisk z niektórymi stylami na nim. Chciałbym, aby przycisk pokazywał mysz nad stanem, gdy fokus znajduje się w polu tekstowym obok niego. czy to możliwe?Czy udaje się najechać myszką na WPF?

Myślę, że będzie to dotyczyć czegoś takiego. Mogę uzyskać pole tekstowe za pomocą FindVisualChild i FindName. Następnie mogę ustawić zdarzenie GotFocus na polu tekstowym, aby coś zrobić.

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus); 

Tutaj w TB_GotFocus utknąłem. Mogę uzyskać przycisk Chcę pokazać mysz nad stanem, ale nie wiem, jakie zdarzenie mu wysłać. MouseEnterEvent jest niedozwolone.

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

Czy możesz opublikować swój szablon kontroli, abyśmy mogli zobaczyć? –

Odpowiedz

2

Nie sądzę, że to możliwe, aby sfałszować zdarzenie ale można wymusić przycisk, aby uczynić się jakby miał po najechaniu myszką.

należy odwoływać się do PresentationFramework.Aero.dlll, aby działało, a następnie będzie działać tylko w systemie Vista dla motywu Aero.

Jeśli chcesz, aby działał z innymi motywami, powinieneś stworzyć niestandardowy szablon kontrolny dla każdej motywu, który chcesz obsłużyć.

Zobacz http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx wskazówki

+0

To działałoby dla większości osób, które podejrzewam, ale używam niestandardowego szablonu przycisku, więc domyślny motyw systemu Windows nie będzie dla mnie działał. – Jippers

0

jako uzupełnienie do komentarza jesperll jest, myślę, że można obejść wykonaniem niestandardowego szablonu dla każdego tematu przez dynamicznie ustawieniu stylu do tego chcesz/null.

Oto moje okno ze zdefiniowanym stylem (ale nie ustawione na nic).

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

Zamiast ustawiać styl poprzez wyzwalacze w szablonie, można użyć zdarzenia w swoim .cs złożyć tak:

...

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

Dostajesz odwołanie do stylu w konstruktorze, a następnie dynamiczne ustawienie/wyłączenie go. W ten sposób możesz zdefiniować wygląd swojego stylu w Xaml i nie musisz polegać na żadnych nowych zależnościach.

Powiązane problemy