Возможно ли подделать мышку WPF? - PullRequest
9 голосов
/ 21 января 2009

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

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

  } 

Ответы [ 2 ]

2 голосов
/ 21 января 2009

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

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

См. http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx для подсказок

0 голосов
/ 26 января 2009

Как продолжение комментария Джесперла, я думаю, что вы можете обойтись без создания собственного шаблона для каждой темы, динамически установив стиль на нужный вам / 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>

Вместо того, чтобы устанавливать стиль с помощью триггеров в шаблоне, вы можете использовать события в вашем файле .cs следующим образом:

...

    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, и вам не нужно полагаться на какие-либо новые зависимости.

...