Tengo un botón de opción de línea múltiple y quiero que la viñeta esté a la izquierda del contenido (por defecto) alineado con la parte superior del control del botón de opción. ¿Cuál es la forma más fácil de hacer esto en XAML?¿Cómo hago que la Bullet de RadioButton se alinee en la parte superior?
Respuesta
Nota: Asegúrese de revisar Rachel's answer - ella toma esta un paso más en una plantilla genérica
En primer lugar no pierda su tiempo con VerticalAlignment
o VerticalContentAlignment
(o incluso ControlTemplate
). No harán lo que quieran o esperen.
Como se describe en MSDN a BulletDecorator
(que es el control que CheckBox y RadioButton utilizan para procesar un botón de radio/comprobación) configurará la posición del icono automáticamente. Usted no tiene ningún control adicional sobre esto:
una bala siempre se alinea con la primera línea de texto cuando el objeto Niño es un objeto de texto. Si el objeto secundario no es un objeto de texto, la viñeta se alinea con el centro del objeto secundario.
A menos que cambie la plantilla de control (innecesario) sólo será capaz de posicionarse en el icono de la radio/verificación en la parte superior si el contenido es texto.
Así que si haces algo como esto no se verá bien porque no podrás mover el ícono sin importar cuántas propiedades VerticalAlignment
intentes establecer.
<RadioButton>
<StackPanel>
<TextBlock Text="First line"/>
<TextBlock Text="Something else"/>
</StackPanel>
</RadioButton>
PERO Afortunadamente, usted puede poner casi cualquier cosa que desee en un TextBlock
usando InlineUIContainer
. El texto (o contenido) en la primera línea determinará la posición del icono automáticamente. Si quieres algo por debajo de la primera línea que no es de texto, sólo tiene que utilizar <Linebreak/>
y luego <InlineUIContainer/>
Aquí hay un ejemplo que tiene un gran tamaño TextBox
para mostrar con mayor claridad lo que está pasando.
<RadioButton>
<TextBlock VerticalAlignment="Top" TextWrapping="Wrap">
<TextBlock Text="Products with <" VerticalAlignment="Center" Margin="0,0,5,0"/>
<InlineUIContainer BaselineAlignment="Center">
<TextBox FontSize="30" Width="25" Text="10" Margin="0,0,5,0"/>
</InlineUIContainer>
<TextBlock VerticalAlignment="Center" Margin="0,0,5,0">
<Run Text="days" FontWeight="Bold"/>
<Run Text="inventory" />
</TextBlock>
<LineBreak/>
<InlineUIContainer>
<StackPanel>
<CheckBox Content="Include unsold products" />
<CheckBox Content="Include something else" />
</StackPanel>
</InlineUIContainer>
</TextBlock>
</RadioButton>
Un consejo muy útil. ¡Gracias! –
ja Acabo de notar que tengo VerticalAlignment = "Top" después de haber dicho que no era necesario. Creo que probablemente no está aquí –
El estilo predeterminado de WPF RadioButton ya no usa BulletDecorator en Windows 8 (aero2). Parece que no requiere este truco y puede agregar una Grilla. Todavía necesita este truco en Windows XP (luna). Tal vez Windows 7 (aero) es lo mismo que Windows 8 pero no puedo verificar esto en este momento. – Zodman
Anula la plantilla de control para el botón de radio. Aquí está el ejemplo de MSDN Radio Button Control Template Example
Si no desea anular la plantilla Control.Template para el botón de opción, puede convertir el contenido en un TextBlock Envuelto. ver esta muestra
<RadioButton Name="radioButton1">
<TextBlock TextWrapping="Wrap">Here is some multiline text that does some wrapping</TextBlock>
</RadioButton>
Tenía la esperanza de hacerlo sin necesidad de anular la plantilla de botón de radio ya que la alineación es lo único que quiero cambiar. –
¿Desea que el botón de opción se sitúe encima del texto o desea que el botón de radio esté al lado del otro con el botón alineado en la parte superior de la fila (como al lado de un párrafo)? – bendewey
Y me gustaría hacerlo también para CheckBoxes, que debería tener la misma solución. –
He construido una plantilla relativamente genérico basado en Simon Weaver's answer que se puede utilizar en la mayoría de situaciones sin tener que recordar para personalizar su RadioButton.Content
todo el tiempo.
<ControlTemplate x:Key="MultiLineRadioButtonTemplate" TargetType="{x:Type RadioButton}">
<RadioButton IsChecked="{TemplateBinding IsChecked}">
<TextBlock>
<LineBreak />
<InlineUIContainer>
<ContentPresenter Margin="0,-21,0,8"
Content="{TemplateBinding ContentPresenter.Content}"
ContentTemplate="{TemplateBinding ContentPresenter.ContentTemplate}"/>
</InlineUIContainer>
</TextBlock>
</RadioButton>
</ControlTemplate>
Para explicar cómo funciona la plantilla:
El
TextBlock
está ahí porque por defecto, la bala RadioButton se alinea con la primera línea de texto si el contenido es un objeto de texto (unLabel
se no funciona)el
LineBreak
es envolver el contenido a una nueva línea, por lo que se crea la primera líneaEl
InlineUIContainer
es por lo que podemos colocar el contenido no textual en unTextBlock
El
ContentPresenter
es mantener el contenido real, y tiene un margen superior negativo para eliminar el espacio dejado por el objetoLineBreak
.
Aquí hay algunos contenidos ejemplo:
<StackPanel>
<RadioButton Template="{StaticResource MultiLineRadioButtonTemplate}">
<StackPanel>
<Label Content="Option 1" />
<StackPanel>
<CheckBox Content="Some setting" />
<CheckBox Content="Some other setting" />
</StackPanel>
</StackPanel>
</RadioButton>
<RadioButton Template="{StaticResource MultiLineRadioButtonTemplate}">
<StackPanel>
<Label Content="Option 2" />
<DataGrid AutoGenerateColumns="False" Height="100">
<DataGrid.Columns>
<DataGridTextColumn Header="Id" />
<DataGridTextColumn Header="Date" />
<DataGridTextColumn Header="Total" />
<DataGridTextColumn Header="Count" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</RadioButton>
<RadioButton Template="{StaticResource MultiLineRadioButtonTemplate}">
<StackPanel>
<Label Content="Option 3" />
<TextBlock TextWrapping="WrapWithOverflow" Margin="2">
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum.
</TextBlock>
</StackPanel>
</RadioButton>
</StackPanel>
Y como se ve:
La única cosa que realmente no estoy feliz por es el margen superior negativo para el ContentPresenter
está codificado, porque si alguna vez cambia el tamaño de la fuente, tiene que ajustar manualmente ese margen.
Probablemente no sería tan difícil construir un convertidor para la propiedad Margin
que calcula la altura del salto de línea ({TemplateBinding FontSize}
?), O incluso una versión extendida del control RadioButton que tiene este comportamiento por defecto, pero por ahora estoy de acuerdo con la codificación -21 basada en el tamaño de fuente predeterminado de mi aplicación.
Además, es posible que desee añadir un poco de TemplateBindings
a la RadioButton
en la plantilla si desea heredar otras propiedades de la original RadioButton
, como márgenes, rellenos, alineación, etc. Sólo obligado a IsChecked
con el propósito de manteniéndolo simple.
Parece que va a ser realmente útil, buen trabajo. –
genial :-) Gracias –
Usando la plantilla de alguna forma se detiene el botón de opción para usar GroupName. Esto significa que en el ejemplo anterior, el usuario puede verificar las tres opciones, lo que significa que ya no es un botón de opción. – redsolo
- 1. ¿Cómo hago la parte superior 1 en Oracle?
- 2. ¿Cómo hago para que UIWebView se desplace hasta la parte superior?
- 3. ¿Cómo puedo hacer que mi wxpython se muestre en la parte superior de mi escritorio?
- 4. Cabecera UITableView que se mantiene en la parte superior
- 5. ¿Cómo hago que mi banner de iAd aparezca en la parte inferior de la pantalla?
- 6. Hacer FancyBox aparece en la parte superior
- 7. haga que UIView en UIScrollView se adhiera a la parte superior cuando se desplazó hacia arriba
- 8. ¿Cómo hago las esquinas redondeadas solo en la parte superior del borde en css?
- 9. ¿Cómo hacer que un TextBlock se alinee a la derecha?
- 10. Cómo evitar que GCC se alinee
- 11. Enfrente de "siempre en la parte superior"
- 12. ¿Cómo desplazar QPlainTextEdit a la parte superior?
- 13. Java setFullScreenWindow() mantener en la parte superior
- 14. ¿Cómo agregar una vista en la parte superior del teclado?
- 15. Mantener diálogos en la parte superior de la ventana, pero no en la parte superior de todo
- 16. ¿Cómo hago para que una imagen comience en la parte inferior de su contenedor?
- 17. Alineación flotante CSS en la parte superior
- 18. Alinee las celdas en la parte inferior y superior de UITableView, dejando un espacio elástico en el medio
- 19. LINQ Únete en la parte superior 1
- 20. UITextView margen extraño en la parte superior?
- 21. cómo asegurar que JDialog siempre se mantenga en la parte superior
- 22. siempre en la parte superior div dentro de la zona
- 23. ¿Cuál es la mejor manera de hacer una barra superior fija que no se superpone a la parte superior?
- 24. aplicación de Android que se ejecuta en la parte superior de todas las demás aplicaciones?
- 25. Determine la distancia desde la parte superior de un div a la parte superior de la ventana con javascript
- 26. Cómo creo una actividad que esté visible en la parte superior de la pantalla de bloqueo
- 27. Corriendo/Interpretando C en la parte superior de la JVM?
- 28. % Columna de la CPU y carga en la parte superior
- 29. ¿Cómo hago para que la casilla de verificación en Android CheckedTextView se alinee a la izquierda en lugar de alinear a la derecha?
- 30. ¿Cómo mantener un QWidget siempre en la parte superior?
Actualicé mi publicación, esto parece funcionar. – bendewey