control de selección de ángulo redondo wpf
AngleControl.xaml
p> seOver"?Value="True"> AngleControl.cspublic;partial;class;UserControl { public;static;readonly;DependencyProperty;AngleProperty;=;DependencyProperty.Register( "Ángulo",;tipo de(doble),;tipo de(AngleControl),;nuevo?PropertyMetadata(0D)); ¿evento?público?AngleChangedEventHandler?AngleChanged; ¿público? AngleControl() { InitializeComponent(); } //? //?Ángulo //? ¿público?doble?Ángulo { obtener?{?return ?(doble)GetValue(AngleProperty);? establecer? { valor?=?valor?%?360; SetValue(AngleProperty,?value); Transform(value); } } ¿privado?remitente,?MouseButtonEventArgs ?e) { var?point?=?e.GetPosition(alCtl); Transformar(punto); } remitente?privado,Mous eEventArgs?e) { if(e.LeftButton?==MouseButtonState.Pressed) { var?point? =e.GetPosition(alCtl); Transformar(punto); } } ¿Privado?void?Transformar(Punto ?punto) { var?cenx?=?alCtl.ActualWidth?/?2; var?ceny?=?alCtl.ActualHeight?/ ?2; Ángulo?=?GetAngle(cenx, ceny, punto.X, punto.Y); } privado?Template.FindName( "Radio",?alCtl)?as?Line; var?transformGroup?=?new?TransformGroup(); var?RotateTransform(angle); transformGroup.Children.Add(transform); radius.RenderTransform?=?transformGroup; DispatchAngleChanged(ángulo); } privado?doble?GetAngle(doble?cenx,?doble?ceny,?doble?pox,?doble?poy) { /*?a?_____? c *|/ *|?/ *|?/ *|/ *b *?tan∠abc?=?ac?/?ab */ var?ac?=?pox?- ?cenx; var?ab?=?ceny?-?poy; if?(ab?==?0) return?0; var?rate?=?Math.Atan(ac?/?ab)?/?Math.PI?*?180; rate?=?poy?<=? ceny cenx? :?360?+?tasa :?180?+?tasa; tasa de retorno; } ¿privado?void?DispatchAngleChanged(doble?ángulo) { si?(AngleChanged!=?null) { var?e? =?new?AngleChangedEventArgs(ángulo); AngleChanged(este,?e); } } } } ¿público? delegado?void?AngleChangedEventHandler(objeto?remitente,?AngleChangedEventArgs??e); público?EventArgs { público?AngleChangedEventArgs(doble?ángulo) { Ángulo?=?ángulo ; } ¿público?doble?ángulo; { ge t; privado?set; } } [ValueConversion(tipode(doble),?tipode(doble)) ] ¿clase pública?RadiusConverter:?MarkupExtension,?IValueConverter] { ¿objeto público?Convert(objeto?valor,?Tipo?tipo de destino, ?objeto?parámetro,?System.Globalization.CultureInfo?cultura) { retorno?(doble)valor?/?ConvertBack(objeto?valor,?Tipo?targetType,? objeto?parámetro,?System.Globalization.CultureInfo?cultura) { Valor de retorno (doble)*?2; } public?RadiusConverter(); } } La propiedad "Ángulo" del control es el ángulo " Evento AngleChanged" Puede usarse para capturar cambios Si no está satisfecho con el color, puede usar xaml?>MainWindow.xaml xmlns=" p> xmlns:x=" xmlns:local="clr-namespace :WpfApplication1" Título="Ventana principal"?Altura ="200"?Width=" 200"?WindowStartupLocation="CenterScreen"> AngleChanged="angleControl_AngleChanged"/> MainWindow.cspublic?MainWindow() { p> InitializeComponent() } privado?AngleChangedEventArgs?e) >{ TxbAngle.Text?=?Math.Floor(e.Angle).ToString(); } } } 1-1