我有一个带有文本框的数据模板和一个带有一些样式的按钮。当焦点位于旁边的文本框上时,我希望按钮显示鼠标悬停状态。这可能吗?
我认为它会涉及到这样的事情。我可以通过使用FindVisualChild和FindName来获取文本框。然后我可以在文本框上设置GotFocus事件来做某事。
_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus);
在TB_GotFocus中,我被困住了。我可以得到我想要显示鼠标状态的按钮,但我不知道发送给它的是什么事件。
。不允许使用MouseEnterEventvoid 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 :(得分: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.dlll才能使用此功能,然后它才能在Vista上用于Aero主题。
如果您希望它适用于其他主题,您应该为要支持的每个主题制作自定义控件模板。
请参阅http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx了解提示
答案 1 :(得分:0)
作为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>
您可以使用.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中定义您希望样式的样子,并且您不必依赖任何新的依赖项。