2011-01-24 23 views
7

He creado un UserControl que es un anillo superponiendo 2 círculos, el círculo pequeño está en blanco y el segundo detrás del más pequeño está coloreado.Cómo crear un círculo con un agujero en un círculo en WPF?

En mi aplicación WPF, quiero poner varios anillos pero el círculo pequeño esconde otros anillos. Me gustaría ver a través de él y también capturar el evento del mouse para el anillo detrás de otros anillos, de lo contrario no son anillos reales. Es posible ?

me trataron OpacityMask para la pequeña elipse como se ha señalado por la respuesta a http://social.msdn.microsoft.com/forums/en-US/wpf/thread/551201d1-c5b3-4e17-ae63-625cfbb8bcc4 pero todavía no puede ver el anillo detrás del agujero:

<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

Respuesta

9

Parece que ya ha encontrado su respuesta (hace unos años), pero para una persona que quiere hacer esto, es posible que desee comprobar hacia fuera CompositeGeometry :

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

Tales como:

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

Entonces IsHitTestVisible="False" debe evitar la interferencia del mouse, cuando sea necesario.

+0

¡Gran característica! – Mixer

+0

¿Es posible estirar y centrar la ruta en su elemento primario? – nrofis

+0

Esa es una buena respuesta. – dotNET

9

Se podía crear un círculo con un fondo transparente y una StrokeThickness en 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: Se puede establecer un pincel de degradado a la carrera de la siguiente manera. Puede reemplazar el LinearGradientBrush con cualquier otro tipo de cepillo que desee.

<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

Intenté que el problema es que ya no es un anillo ya que puedo ver el gran círculo detrás :) Quiero un segundo círculo para aplicarle un degradado, por lo que un borde grande no puede hacer esto por lo que puedo prever. – user310291

+0

Wonderfull gracias :) – user310291

0

Echa un vistazo a este How to create a doughnut with a transparent center?.

Código con la ruta y el botón debajo de ella:

<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

Lo intenté pero parece que no funciona. – user310291

+0

Lo que no funciona exactamente He intentado ejecutar el código publicado (el ejemplo de ruta) con el botón debajo de él. – baalazamon

+0

Ah ok, lo intento de nuevo ... – user310291

Cuestiones relacionadas