Возможна ли подделка наведения мыши WPF?

У меня есть шаблон данных с текстовым полем и кнопкой с некоторыми стилями. Я хотел бы, чтобы кнопка показывала состояние мыши, когда фокус находится на текстовом поле рядом с ней. Это возможно?

Я полагаю, что это будет связано с чем-то вроде этого. Я могу получить текстовое поле с помощью FindVisualChild и FindName. Затем я могу установить событие GotFocus в текстовом поле, чтобы что-то сделать.

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus);

Вот в TB_GotFocus я застрял. Я могу получить кнопку, для которой я хочу показать состояние мыши, но я не знаю, какое событие ей отправить. MouseEnterEvent не разрешен.

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

  } 

person Jippers    schedule 21.01.2009    source источник
comment
Можете ли вы опубликовать свой шаблон управления, чтобы мы могли его увидеть?   -  person Bob King    schedule 23.01.2009


Ответы (2)


Я не думаю, что это возможно подделать событие, но вы можете заставить кнопку отображать себя как если бы она имела 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);
}

вам нужно сослаться на PresentationFramework.Aero.dll, чтобы это работало, и тогда это будет работать только в Vista для темы Aero.

Если вы хотите, чтобы это работало для других тем, вы должны создать собственный шаблон управления для каждой темы, которую вы хотите поддерживать.

См. http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx для советов

person Jesper Larsen-Ledet    schedule 21.01.2009
comment
Я подозреваю, что это сработает для большинства людей, но я использую настраиваемый шаблон кнопки, поэтому тема Windows по умолчанию не будет работать для меня. - person Jippers; 21.01.2009

В продолжение комментария jesperll, я думаю, вы можете обойти создание собственного шаблона для каждой темы, динамически установив стиль на тот, который вы хотите / null.

Вот мое окно с определенным стилем (но ничего не задано).

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

Instead of setting the style via triggers in the template, you can use events in your .cs file like so:

...

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

Вы получаете ссылку на стиль в конструкторе, а затем динамически устанавливаете/сбрасываете его. Таким образом, вы можете определить, как должен выглядеть ваш стиль в Xaml, и вам не придется полагаться на какие-либо новые зависимости.

person Michael    schedule 26.01.2009