xaml:
<Window x:Class="WpfApp3Test.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       Title="MainWindow" 
       Height="600" Width="800"
       WindowStartupLocation="CenterScreen">
    <Window.Resources>
        <Style x:Key="BorderStyle" TargetType="Border">
            <Setter Property="Height" Value="30"/>
            <Setter Property="Background" Value="YellowGreen"/>
        </Style>
        <Style x:Key="TextBlockStyle" TargetType="TextBlock">
            <Setter Property="Foreground" Value="Yellow"/>
            <Setter Property="FontSize" Value="20"/>
        </Style>
    </Window.Resources>
<Grid x:Name="parentGrid">
        <!-- 组件A -->
        <Canvas x:Name="ComponentA" MouseLeftButtonDown="A_MouseLeftButtonDown">
            <Rectangle Width="500" Height="300" Fill="LightBlue" />
            <TextBlock Canvas.Left="20" Canvas.Top="20" Text="组件A(Canvas)" FontSize="16" />
        </Canvas>
        <!-- 组件B 使用 Margin 进行定位 -->
        <Border x:Name="ComponentB"
                Width="300" Height="250"
                BorderBrush="Black" BorderThickness="1"
                HorizontalAlignment="Left" VerticalAlignment="Top">
            <!-- 用 Margin 替代 Canvas.Left/Top -->
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="30" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Border x:Name="TitleBar"
                        Grid.Row="0"
                        Style="{StaticResource BorderStyle}"
                        MouseLeftButtonDown="B_TitleBar_MouseLeftButtonDown"
                        MouseMove="B_TitleBar_MouseMove">
                    <TextBlock Text="B的标题栏" Style="{StaticResource TextBlockStyle}"
                               VerticalAlignment="Center" Margin="5" />
                </Border>
 <ScrollViewer Grid.Row="1"
                              VerticalScrollBarVisibility="Auto"
                              IsHitTestVisible="False">
                    <ItemsControl x:Name="ContentItems">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" Margin="5" FontSize="14" />
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </ScrollViewer>
            </Grid>
        </Border>
    </Grid>
</Window>
xaml.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp3Test
{
    /// <summary>
    ///
    /// /// MainWindow.xaml 的交互逻辑
    /// /// </summary>
    public partial class MainWindow : Window
    {
        private bool _isDragging = false;
        private Point _startMousePosition;
        private Thickness _startMargin;
        public MainWindow()
        {
            InitializeComponent();
            ContentItems.ItemsSource = new List<string> { "项1", "项2", "项3" };
        }
        private void A_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("点击了组件A");
        }
        private void B_TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (!_isDragging)
            {
                _isDragging = true;
                _startMousePosition = e.GetPosition(parentGrid); // 基于 Grid
                _startMargin = ComponentB.Margin;
                TitleBar.CaptureMouse();
            }
            else
            {
                _isDragging = false;
                TitleBar.ReleaseMouseCapture();
            }
            e.Handled = true; // 防止事件冒泡
        }
        private void B_TitleBar_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isDragging && TitleBar.IsMouseCaptured)
            {
                Point currentMousePos = e.GetPosition(parentGrid);
                double offsetX = currentMousePos.X - _startMousePosition.X;
                double offsetY = currentMousePos.Y - _startMousePosition.Y;
                ComponentB.Margin = new Thickness(
                    _startMargin.Left + offsetX,
                    _startMargin.Top + offsetY,
                0, 0);
            }
        }
    }
}