WPF C#实现调整大小手柄

4

我希望在我的工具中添加一个调整大小的手柄。我知道可以通过设置ResizeMode="CanResizeWithGrip"来激活手柄,但是我希望手柄在一个栅格(Grid)中,并且只在悬停时可见。 我创建了一个带有图像的栅格(Grid)。

<Grid x:Name="gridResize" Background="Transparent" >
    <Image x:Name="resizeGrip" HorizontalAlignment="Left" 
           Height="30" 
           VerticalAlignment="Top" 
           Width="27"  
           Source="UserControls/Images/sizegrip.png"/>
</Grid>

我需要在代码中处理这些事件:

private void ResizeGrip_MouseDown(object sender, MouseButtonEventArgs e)
{
    throw new NotImplementedException();
}

private void GridResize_MouseLeave(object sender, MouseEventArgs e)
{
    gridResize.Visibility = Visibility.Hidden;
}

private void GridResize_MouseEnter(object sender, MouseEventArgs e)
{
    gridResize.Visibility = Visibility.Visible;
}

有人知道如何实现鼠标按下方法吗?

你确定你不是在寻找这个:http://www.wpf-tutorial.com/panels/gridsplitter/吗? - yan yankelevich
1
一些建议:使用Thumb进行调整大小或拖动。它提供了易于使用的事件Thumb.DragDelta,可为X和Y提供鼠标移动增量。如果您想要调整网格或任何其他UI元素的大小,则最好使用带有3x3行X列的网格,并在侧边行\列上放置8个“拇指”,以便您可以轻松实现每个方向的调整。 - Shakra
随机想法:如果可见性设置为隐藏,它是否会接收鼠标事件? - Manfred Radlwimmer
@ManfredRadlwimmer 不会的:D我得隐藏图片:D - itskajo
2个回答

1
Here is a simple example (注意我使用了边框而不是图片,但更改它很简单)
Xaml
 <Window x:Class="Test.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"
    xmlns:local="clr-namespace:Test" 
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    mc:Ignorable="d"
    Title="MainWindow"
    PreviewMouseMove="window_PreviewMouseMove">

<Grid>
    <Grid Background="Red" x:Name="gridResize"  Margin="236,235,0,0" >
        <Border Focusable="True" Background="Black" BorderBrush="LightGray" BorderThickness="1" Opacity="0.2" x:Name="resizeGrip" HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="27" 
                PreviewMouseLeftButtonDown="resizeGrip_PreviewMouseLeftButtonDown" PreviewMouseLeftButtonUp="resizeGrip_PreviewMouseLeftButtonUp"  >
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter  Property="Opacity" Value="1.0"/>
                            <Setter Property="Cursor" Value="SizeNWSE"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
</Grid>

</Window>

代码

public partial class MainWindow : Window
{ 
    public MainWindow()
    {
        this.InitializeComponent(); 
    }

    Point _startPosition;
    bool _isResizing = false;
    private void resizeGrip_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (Mouse.Capture(resizeGrip))
        {
            _isResizing = true;
            _startPosition = Mouse.GetPosition(this);
        }
    }

    private void window_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (_isResizing)
        {
            Point currentPosition = Mouse.GetPosition(this);
            double diffX = currentPosition.X - _startPosition.X;
            double diffY = currentPosition.Y - _startPosition.Y;
            double currentLeft = gridResize.Margin.Left;
            double currentTop = gridResize.Margin.Top;
            gridResize.Margin = new Thickness(currentLeft + diffX, currentTop + diffY, 0, 0);
            _startPosition = currentPosition;
        }
    }

    private void resizeGrip_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (_isResizing == true)
        {
            _isResizing = false;
            Mouse.Capture(null);
        }

    }


}

如果我使用SizeChanged事件来确保窗口保持其比例,那么if (diffX < diffY) this.Height = ActualHeight + diffY; else this.Height = ActualHeight + diffX;将实现此目的。谢谢您的帮助 :) - itskajo

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接