WPF: Ограничение допустимой части управления для операции перетаскивания через DependencyObject - PullRequest
0 голосов
/ 12 марта 2009

Я задаю этот вопрос после прочтения этого ответа в StackOverflow.

Приведенный ответ отлично работает для того, чтобы вы могли переместить весь элемент управления. Но предполагается, что у меня есть пользовательский контроль, который я создал так:

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

Я хочу, чтобы элемент управления двигался только когда я щелкаю мышью по заголовочной части элемента управления, Grid.Row [0] (оранжевая часть) Я не хочу, чтобы элемент управления реагировал на операции перетаскивания при нажатии на остальную часть элемента управления.

Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 13 марта 2009

Предполагая, что вы используете присоединенное свойство DraggableExtender.CanDrag, вы можете настроить триггер для его включения и выключения в зависимости от того, находится ли мышь над оранжевым заголовком:

<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>
1 голос
/ 13 марта 2009

Итак, покопавшись, я решил свою проблему. Решение состояло в том, чтобы использовать Thumb .

Мой UserControl XAML выглядит так:

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

Мы можем видеть добавление большого пальца другого цвета, которое закрывает оранжевый заголовок (давая мне знать, что большой палец действительно есть)

Код для событий Thumb выглядит следующим образом:

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 );
        }
    }

И это дало мне именно то, что я хотел. Один вопрос остался: я вижу некоторый разрыв пользовательского контроля, когда я перемещаю его. Это просто не гладкий эффект рисования, и я не могу найти способ устранить это. Есть какие-нибудь подсказки?

0 голосов
/ 12 марта 2009

Я нашел действительно отличный пример на CodeProject, который называется DiagramDesigner. Это должно привести вас в правильном направлении. CodeProject, DiagramDesigner4

...