2014-04-01 7 views
10

Ich kämpfe gerade gegen einen anderen WPF Kampf, nämlich mouseEvents. Ich habe im Grunde eine sehr einfache Kontrolle (eine Border enthält eine Grid, die selbst ein paar TextBlocks hat). Ich versuche, ein einfaches Verhalten zu erreichen: Doppelklick sollte das Steuerelement in Bearbeitungsmodus (die in der Tat verbirgt die TextBlocks mit TextBoxes gebunden an die gleichen Daten.WPF MouseDown Event feuert nicht überall in einer Steuerung

nichts Schickes, oder? Nun noch, ich kämpfe. die MouseDoubleClick verknüpfen meinen UserControl feuert nur, wenn ich in einem Steuer klicken (wie ein Klick auf einen Textblock). Wenn ich zwischen TextBlocks auf einen leeren Platz klicken, wird nichts gebrannt. Nicht einmal MouseDown.

Wie könnte ich es machen arbeiten, um jeden Mausklick zu fangen? Ich nahm an, dass die Verknüpfung eines MouseDown Ereignisses mit einem Border sollte jeden Klick auf den Rand fangen, aber ... es am Ende keine Klicks zu fangen an leeren Teilen der Grenze.

hier etwas Entwurf Code, den ich für Sie es ausführen gemacht:

XAML:

<StackPanel Orientation="Vertical"> 
    <Border Height="400" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="Black" BorderThickness="2" 
     MouseDown="Border_MouseDown" MouseUp="Border_mouseUp"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Grid> 

    </Border> 

    <TextBlock Height="100" Width="300" HorizontalAlignment="Center" TextAlignment="Center" x:Name="thetext" Visibility="Collapsed" 
       Foreground="White" Background="Red" Text="CLICKED!" /> 
</StackPanel> 

-Code hinter:

private void Border_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     thetext.Visibility = Visibility.Visible; 
    } 

    private void Border_mouseUp(object sender, MouseButtonEventArgs e) 
    { 
     thetext.Visibility = Visibility.Collapsed; 
    } 

Jetzt versuchen Sie eine der "BLUFF" klicken Texte: Ein "CLICKED" Text erscheint. Klicke irgendwo anders zwischen den TextBlocks: Nichts passiert.

Vielen Dank!

Antwort

25
<StackPanel Background="Transparent" ... 

oder

<Border Background="Transparent" ... 

sollte es tun ...

Dies macht das Gitter transparent, aber sichtbar für Mausklicks.

Look here Form mehr Informationen.

Es gibt einige andere Umstände, wo Sie das PreviewXXX-Ereignis verwenden müssen, das ist, wenn ein Kindelement das Ereignis weg "verschluckt", aber in Ihrem Fall das oben genannte was Sie suchen.

+4

Gut. Das war unerwartet leicht - und dumm. Danke für die schnelle Antwort. Ich habe immer gedacht, Standard-Hintergrundfarbe war Transparent. Danke vielmals! Es gibt einen Tag, an dem WPF kämpft – Damascus

Verwandte Themen