2010-12-16 7 views
2

Ich habe ein einfaches Benutzersteuerelement, deren direkte Kind-Element ist eine Grenze: -Maus direkt über Grenze in WPF

<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent"> 
    <Grid>...Content here...</Grid> 
</Border> 

Wie kann ich erkennen, dass die Maus über den Grenzbereich, dh der 5 Pixel-Rahmen selbst? Während die Maus dort ist, möchte ich den Randpinsel zu einer anderen Farbe drehen. Wenn die Maus in den Haupt-Grid-Inhalt wechselt, möchte ich den Rahmen-Pinsel umkehren.

Antwort

8

Sie können dies tun, indem Sie einen Stil an der Grenze platzieren und einen Trigger verwenden.

Beachten Sie, dass Sie die normale Farbe im Stil festlegen müssen, da die Einstellung direkt auf dem Rahmen einen lokalen Wert festlegen würde, der den Trigger überschreibt.

<Border x:Name="LayoutRoot" BorderThickness="5"> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Setter Property="BorderBrush" Value="Transparent"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="BorderBrush" Value="Green"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
    <Grid>...Content here...</Grid> 
</Border> 

Sie auch den Style in einem Ressourcenverzeichnis setzen könnte, so dass Sie es auf mehrere Border-Elemente teilen können:

<UserControl.Resources> 
    <Style TargetType="Border" x:Key="borderGreenOnHover"> 
     <Setter Property="BorderBrush" Value="Transparent"/> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="BorderBrush" Value="Green"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 
<Border x:Name="LayoutRoot" BorderThickness="5" 
     Style="{StaticResource borderGreenOnHover}"> 
    <Grid>...Content here...</Grid> 
</Border> 

Wenn die Maus innerhalb der Grenze ist, wird der Trigger nicht Feuer. Dies liegt daran, dass der Standardhintergrund für einen Rahmen null und nicht Transparent ist, sodass der Hintergrundbereich nicht auf hit testing reagiert. Wenn Sie die Border.Background-Eigenschaft auf Transparent oder einen anderen Pinsel festlegen, wird der Trigger ausgelöst, wenn sich die Maus irgendwo über dem Rand befindet.

Wenn Sie einen Nicht-Null-Hintergrund für den Rahmen möchten, aber nur ausgelöst werden soll, wenn sich die Maus über dem Rahmen befindet, können Sie IsMouseDirectlyOver anstelle von IsMouseOver verwenden, was falsch ist, wenn die Maus über a ist Kindelement. Sie könnten dann den Hintergrund im Raster auf Transparent setzen, so dass sich die Maus immer über dem Raster befindet. (Eigentlich, wenn Sie möchten, dass der Inhalt eine Hintergrundfarbe hat, wäre es einfacher, sie einfach im Grid zu setzen.)

+0

Ich frage mich hier aber, wie ich es vorgeschlagen habe. Ist es nicht wirklich der WPF-Weg oder? Ich lerne immer noch WPF, das Sie sehen, und ich bin im Grunde an WinForms gewöhnt: P. Danke im Voraus! – Citroenfris

+0

Was passiert, wenn sich die Maus über den inneren Gitterinhalt bewegt? – AnthonyWJones

+0

Nichts, es ist immer noch im Rahmen, so dass der IsMouseOver-Wert immer noch stimmt. –

0

Dies kann mit dem MouseEnter & MouseLeave Ereignisse von der Grenze überprüft werden.

XAML:

<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent" MouseEnter="border_MouseEnter" MouseLeave="border_MouseLeave"> 
    <Grid>...Content here...</Grid> 
</Border> 

-Code-Behind:

private void border_MouseEnter(object sender, MouseEventArgs e) 
{ 
    Border hoveredBorder= (Border)sender; 
    hoveredBorder.BorderBrush= Brushes.Yellow; 
} 

private void border_MouseLeave(object sender, MouseEventArgs e) 
{ 
    Border hoveredBorder= (Border)sender; 
    hoveredBorder.BorderBrush= Brushes.Black; 
} 

Edit: Ich verwendet Border hoveredBorder = (Border) sender; Sie können diese Ereignisse also für mehr als nur einen Rahmen verwenden. Wenn Sie dies nicht möchten, können Sie einfach diese Zeile entfernen & die gewünschte Grenze gerade in bekommen

Edit2:. Example Application

+0

Dies funktioniert nicht, da MouseLeave nicht ausgelöst wird, während sich die Maus in den inneren Inhalt bewegt. – AnthonyWJones

+0

Ich habe eine WPF-Anwendung erstellt und habe den Code kopiert und für mich funktioniert es, allerdings habe ich den Rahmen in einem Window nicht als User Control, lass mich das jetzt testen. – Citroenfris

+0

Ich habe meine Antwort mit einem Link zu der Beispielanwendung bearbeitet. Wenn das nicht das ist, was du meine apoligies meinst :). – Citroenfris