2009-01-21 43 views
8

Tôi có mẫu dữ liệu với hộp văn bản và nút có một số kiểu trên đó. Tôi muốn có nút hiển thị chuột trên trạng thái khi tiêu điểm nằm trên hộp văn bản bên cạnh nó. Điều này có thể không?Giả mạo có thể di chuột qua WPF không?

Tôi tính nó sẽ liên quan đến một cái gì đó như thế này. Tôi có thể nhận được hộp văn bản thông qua việc sử dụng FindVisualChild và FindName. Sau đó, tôi có thể đặt sự kiện GotFocus trên hộp văn bản để làm điều gì đó.

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus); 

Ở đây trong TB_GotFocus Tôi bị kẹt. Tôi có thể nhận được nút Tôi muốn hiển thị con chuột trên trạng thái của, nhưng tôi không biết những gì sự kiện để gửi cho nó. MouseEnterEvent không được phép.

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

Bạn có thể đăng mẫu kiểm soát của mình để chúng tôi xem không? –

Trả lời

2

Tôi không nghĩ rằng nó có thể giả sự kiện này nhưng bạn có thể buộc nút để render chính nó như thể nó có 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); 
} 

bạn cần tham khảo PresentationFramework.Aero.dlll để làm việc và sau đó nó sẽ chỉ hoạt động trên Vista cho chủ đề Aero.

Nếu bạn muốn nó hoạt động cho các chủ đề khác, bạn nên tạo một controltemplate tùy chỉnh cho từng chủ đề bạn muốn hỗ trợ.

Xem http://blogs.msdn.com/llobo/archive/2006/07/12/663653.aspx cho lời khuyên

+0

Điều này sẽ làm việc cho hầu hết mọi người tôi nghi ngờ, nhưng tôi đang sử dụng một mẫu nút tùy chỉnh để chủ đề cửa sổ mặc định sẽ không hoạt động đối với tôi. – Jippers

0

Là một theo dõi để bình luận jesperll, tôi nghĩ rằng bạn có thể nhận được xung quanh thực hiện một mẫu tùy chỉnh cho từng chủ đề bằng cách tự động thiết lập các phong cách để một trong những bạn muốn/null.

Đây là cửa sổ của tôi, với kiểu được xác định (nhưng không được đặt thành bất kỳ thứ gì).

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

Thay vì đặt kiểu qua trigger trong mẫu, bạn có thể sử dụng các sự kiện trong cs của bạn tập tin như vậy:

...

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

Bạn nhận được một tham chiếu đến kiểu trong hàm tạo và sau đó tự động đặt nó/bỏ đặt nó. Bằng cách này, bạn có thể xác định những gì bạn muốn phong cách của bạn trông giống như trong Xaml, và bạn không phải dựa vào bất kỳ phụ thuộc mới.

Các vấn đề liên quan