Aquí podría ser tu PUBLICIDAD


WPF: limitar la parte de control válida para la operación de arrastre a través de DependencyObject

votos
0

Estoy haciendo esta pregunta después de leer esta respuesta en StackOverflow.

La respuesta proporcionada funciona muy bien para permitirle mover un control completo. Pero supongo que tengo un Usercontrol que he creado así:

<UserControl x:Class=WpfTest.UserControl1
    xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
    xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
    Height=300 Width=300>
    <Border Background=Blue>
        <Grid>
            <Grid.ColumnDefinitions>

            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height=26></RowDefinition>
                <RowDefinition Height=*></RowDefinition>
            </Grid.RowDefinitions>
            <Canvas Grid.Row=0 Background=orange></Canvas>
            <Canvas Grid.Row=1 Background=Purple></Canvas>
        </Grid>
    </Border>
</UserControl>

Solo quiero que el control se mueva cuando hago clic con el mouse en la parte del encabezado del control, Grid.Row [0] (parte naranja). No deseo que el control responda a las operaciones de arrastre al hacer clic en el resto del control.

¿Cómo puedo lograr esto?

Publicado el 12/03/2009 a las 21:04
fuente por usuario Chris Holmes
En otros idiomas...        العربية       

3 respuestas

votos
1

Entonces, después de cavar un poco, resolví mi problema. La solución fue utilizar un pulgar .

Mi UserControl XAML se ve así:

<UserControl x:Class="WpfTest.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Border Background="Blue">
        <Grid>
            <Grid.ColumnDefinitions>

            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="26"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <Canvas Grid.Row="0" Background="orange"></Canvas>
            <Thumb Grid.Row="0" Background="Cyan" DragCompleted="OnDragComplete" DragStarted="OnDragStarted" DragDelta="OnDragDelta" ></Thumb>
            <Canvas Grid.Row="1" Background="Purple"></Canvas>
        </Grid>
    </Border>
</UserControl>

Podemos ver la adición del pulgar con un color diferente, que cubre el encabezado naranja (haciéndome saber que el pulgar está realmente allí).

El código detrás de los eventos Thumb tiene el siguiente aspecto:

public partial class UserControl1 : UserControl
    {
        private bool _isDragging;
        private double _x;
        private double _y;

        public UserControl1()
        {
            InitializeComponent();
        }

        private void OnDragComplete(object sender, DragCompletedEventArgs e)
        {
            _isDragging = false;

        }

        private void OnDragStarted(object sender, DragStartedEventArgs e)
        {
            _isDragging = true;

            _x = (double)GetValue(Canvas.LeftProperty);
            _y = (double)GetValue(Canvas.TopProperty);

        }

        private void OnDragDelta(object sender, DragDeltaEventArgs e)
        {
            if (!_isDragging) return;

            _x += e.HorizontalChange;
            _y += e.VerticalChange;


            SetValue(Canvas.LeftProperty,_x );
            SetValue(Canvas.TopProperty,_y );
        }
    }

Y esto me consiguió exactamente lo que quería. Una pregunta permaneció: veo un desgarro del control de usuario cuando lo muevo. Simplemente no es un efecto de dibujo suave, y parece que no puedo encontrar una manera de eliminar eso. ¿Alguna pista?

Respondida el 12/03/2009 a las 10:58
fuente por usuario Chris Holmes


Aquí podría ser tu PUBLICIDAD


votos
1

Suponiendo que está utilizando la DraggableExtender.CanDragpropiedad adjunta, puede configurar un disparador para activar y desactivar esto, dependiendo de si el mouse está sobre su encabezado naranja:

<UserControl x:Class="WpfTest.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300">
    <UserControl.Style>
        <Style>
            <Setter Property="(DraggableExtender.CanDrag)" Value="False"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, ElementName=headerCanvas}" Value="True">
                    <Setter Property="(drag:DraggableExtender.CanDrag)" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
    <Border Background="Blue">
        <Grid>
            <Grid.ColumnDefinitions>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="26"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <Canvas x:Name="headerCanvas" Grid.Row="0" Background="orange"></Canvas>
            <Canvas Grid.Row="1" Background="Purple"></Canvas>
        </Grid>
    </Border>
</UserControl>
Respondida el 12/03/2009 a las 10:54
fuente por usuario Robert Macnee

votos
-1

Encontré un gran ejemplo en CodeProject llamado DiagramDesigner. Esto debería ayudarte a comenzar en la dirección correcta. CodeProject, DiagramDesigner4

Respondida el 12/03/2009 a las 09:47
fuente por usuario jeff