2011-01-24 16 views
7

Ho creato un controllo utente che è un anello sovrapponendo 2 cerchi con il cerchio piccolo vuoto e il secondo dietro il più piccolo che viene colorato.Come creare un cerchio con un buco in un cerchio in WPF?

Nella mia app WPF, voglio mettere diversi anelli ma il piccolo cerchio nasconde altri anelli. Mi piacerebbe vedere attraverso di esso e anche catturare eventi del mouse per anello dietro altri anelli altrimenti non è anelli reali. È possibile ?

ho provato OpacityMask per piccola ellisse come indicato dalla risposta a http://social.msdn.microsoft.com/forums/en-US/wpf/thread/551201d1-c5b3-4e17-ae63-625cfbb8bcc4, ma ancora non si vede l'anello dietro il foro:

<UserControl x:Class="MyUserControls.MyRing" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="150" d:DesignWidth="150" SizeChanged="UserControl_SizeChanged"> 
    <Grid Height="150" Name="Grid" Width="150" MouseMove="ellipse1_MouseMove"> 
     <Ellipse Fill="Red" Height="150" Width="150" HorizontalAlignment="Left" Margin="0,0,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" > 
      <Ellipse.OpacityMask> 
       <RadialGradientBrush> 
        <GradientStop Color="#FFB94444" Offset="0.496"/> 
        <GradientStop Color="#00FFFFFF" Offset="0.491"/> 
       </RadialGradientBrush> 
      </Ellipse.OpacityMask> 
     </Ellipse> 
     <Ellipse Fill="White" Height="100" Width="100" Margin="25,25,25,0" Name="ellipse2" Stroke="Black" VerticalAlignment="Top" />  
    </Grid> 
</UserControl> 

enter image description here

risposta

9

Sembra che hai già trovato la risposta (alcuni anni fa), ma per chiunque altro cercando di fare questo, si consiglia di controllare CompositeGeometry :

http://msdn.microsoft.com/en-us/library/ms751808.aspx#combindgeometriessection

come:

<Path Fill="Red" Stroke="Black"> 
    <Path.Data> 
     <CombinedGeometry GeometryCombineMode="Xor"> 
      <CombinedGeometry.Geometry1> 
       <EllipseGeometry RadiusX="75" RadiusY="75" Center="75,75" /> 
      </CombinedGeometry.Geometry1> 
      <CombinedGeometry.Geometry2> 
       <EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" /> 
      </CombinedGeometry.Geometry2> 
     </CombinedGeometry> 
    </Path.Data> 
</Path> 

Quindi IsHitTestVisible="False" dovrebbe impedire l'interferenza del mouse, quando necessario.

+0

Grande funzionalità! – Mixer

+0

È possibile allungare e centrare il percorso nel suo genitore? – nrofis

+0

Questa è una bella risposta. – dotNET

9

Si potrebbe semplicemente creare un cerchio con uno sfondo trasparente e un StrokeThickness in UserControl.

<UserControl x:Class="WpfApplication1.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <Ellipse Width="50" Height="50" Stroke="Blue" StrokeThickness="10" Fill="Transparent"></Ellipse> 
    </Grid> 
</UserControl> 

EDIT: È possibile impostare un pennello sfumato alla corsa, come di seguito. È possibile sostituire lo LinearGradientBrush con qualsiasi altro tipo di pennello come si desidera.

<Ellipse Width="50" Height="50" StrokeThickness="10" Fill="Transparent"> 
    <Ellipse.Stroke> 
     <LinearGradientBrush> 
      <GradientStop Offset="0" Color="Red"/> 
      <GradientStop Offset="1" Color="Green"/> 
     </LinearGradientBrush> 
    </Ellipse.Stroke> 
</Ellipse> 
+0

Ho provato che il problema è Non è più un anello dato che posso vedere il grande cerchio dietro :) Voglio un secondo cerchio per applicare qualche sfumatura ad esso, così grande confine non può farlo per quanto posso prevedere. – user310291

+0

Meraviglioso grazie :) – user310291

0

Controllare questo How to create a doughnut with a transparent center?.

codice con il percorso e il pulsante di sotto di essa:

<Grid x:Name="LayoutRoot" Width="109" Height="109"> 

    <Button Content="Below" Width="100" Height="100" /> 

    <Path Fill="#FF1F96D8" Stroke="#FF000000" 
     Width="109" HorizontalAlignment="Left" Stretch="None" 
     Data="M54.5,32.5 C41.245167,32.5 30.5,43.021309 30.5,56   
      30.5,68.978691 41.245167,79.5 54.5,79.5 C67.754837,79.5   
      78.5,68.978691 78.5,56 C78.5,43.021309 67.754837,32.5   
      54.5,32.5 z M54.5,0.5 C84.32338,0.5 108.5,24.676624   
      108.5,54.5 C108.5,84.32338 84.32338,108.5 54.5,108.5   
      24.676624,108.5 0.5,84.32338 0.5,54.5 0.5,24.676624   
      24.676624,0.5 54.5,0.5 z" Height="109" /> 


</Grid> 
+0

Ho provato ma non sembra funzionare. – user310291

+0

Cosa non funziona esattamente Ho provato a eseguire il codice pubblicato (l'esempio di percorso) con il pulsante sotto di esso. – baalazamon

+0

Ah ok, ci sto provando di nuovo ... – user310291