Elementos en los que se puede hacer clic Elemento de control en WPF

Estoy usando ItemsControl para mostrar una lista de elementos vinculados a datos, para cada uno de los cuales el núcleo de DataTemplate es una cuadrícula en la que he colocado todos los controles vinculados.

Me gustaría poder hacer clic en el área completa para cada elemento de la lista. Pero no puedo averiguar cómo hacer que se pueda hacer clic en el área.

Cualquier sugerencia de cómo hacer que se pueda hacer clic en un área de cuadrícula completa sería genial.

preguntado el 28 de agosto de 11 a las 01:08

¿Qué causa exactamente este problema? Estoy tratando de entender por qué sucede esto. ¿No debería un clic en un elemento dar como resultado un evento de mouse de vista previa que baja por el árbol hasta el elemento de vista de árbol? ¿O treeviewitem no es el foco del evento del mouse? Pensé que los eventos del mouse se generaron en función de las pruebas de impacto que obtendrían el elemento más interno en el árbol visual (que supongo que sería el elemento de vista de árbol) y luego lo convertirían en el objetivo del evento:

2 Respuestas

Para hacer que se pueda hacer clic en algo, generalmente puede envolverlo en un Botón, si debería ser "invisible", puede cambiar la plantilla:

<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <ContentPresenter />
    </ControlTemplate>
</Button.Template>

Respondido 28 ago 11, 05:08

+1: Por mi vida, no puedo creer que en los cuatro años que llevo escribiendo en XAML nunca haya pensado en hacer eso. - graso

@fatty: Oh wow; Por mi parte, no puedo creer que la mayoría de los controles tengan todo tipo de eventos de mouse pero no un simple clic, tal vez pensaron que el botón sería inútil, ya que todo se puede diseñar como uno de todos modos (aquí habría una pregunta mía relacionada) - media pensión

Bonito, es una locura pensar en lo atascado que puedes quedarte en tu historia cuando haces lo mismo una y otra vez. No puedo esperar hasta que pueda obtener una conexión de red decente debajo de esta roca bajo la que parece estar viviendo. - graso

Puede utilizar el Clases AttachedCommandBehavior de C # Disciples para lograrlo.

Defina un comando en ViewModel, y luego en el objeto Grid use ACB AttachedProperties para vincular el MouseLeftButtonUp evento al comando.

Algún código para comenzar:

        <Grid Name="grid" Height="30" ForceCursor="True" Cursor="Hand">
            <acb:CommandBehaviorCollection.Behaviors>
                <acb:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding Path=DataContext.EditEventCommand, RelativeSource={RelativeSource AncestorType={x:Type self:Dashboard}}}" CommandParameter="{Binding}" />
            </acb:CommandBehaviorCollection.Behaviors>
        </Grid>

Edite para una solución que no sea MVVM.

El fragmento de código anterior aún funcionará cuando no haya diseñado su aplicación siguiendo las pautas de MVVM, ya que esencialmente solo se está vinculando a un comando en el código subyacente.

Sin embargo, si no quiere tomarse la molestia de definir comandos, simplemente puede especificar un evento al que enlazar, así:

<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp"> en el archivo XAML.

y en el código subyacente:

    private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
    }        

Respondido 28 ago 11, 05:08

¿Eso todavía funciona si no estoy usando MVVM? (Sinceramente, todavía no sé cómo ...) - Adam Haile

Sí, esto seguirá funcionando cuando no use MVVM, pero he actualizado mi respuesta con un código adicional. Tenga en cuenta que esto se activará en MouseUp, no en Click. Si desea disparar al hacer clic, deberá capturar los eventos MouseDown y Up, iniciar un temporizador para medir el tiempo transcurrido entre cada uno y luego disparar en consecuencia. - graso

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.