【问题标题】:WPF C# implementing a resize gripWPF C# 实现调整大小夹点
【发布时间】:2017-02-20 07:19:07
【问题描述】:

我想对我的工具实施调整大小的夹点。我知道我可以通过设置ResizeMode="CanResizeWithGrip" 来激活抓地力,但我想将抓地力置于网格中,该网格仅在悬停时可见。 我用图像制作了一个网格

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

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

【问题讨论】:

  • 你确定你不只是在寻找这个:wpf-tutorial.com/panels/gridsplitter 吗?
  • 很少有建议:使用Thumb 调整大小或/和拖动某些东西。它提供易于使用的事件Thumb.DragDelta,它将为您提供 X 和 Y 的鼠标移动增量。如果您想调整网格或任何其他 UI 元素的大小,最好使用 3x3 rowsXcolumns 的网格并将 8 个拇指放在旁边的行\列上您将轻松实现每个方向的调整大小。
  • 胡思乱想:如果 Visibility 设置为 Hidden,它甚至会得到鼠标事件吗?
  • @ManfredRadlwimmer 不,它不会:D 我必须隐藏图像:D

标签: c# wpf visual-studio xaml .net-4.0


【解决方案1】:

这是一个简单的例子(注意我使用了边框而不是图像,但更改它是直截了当的)

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
【解决方案2】:

已接受答案中的代码不起作用(请参阅wpf: capturing mouse does not work)。改用拇指:

<Thumb Name="ResizeGripper" DragDelta="ResizeGripper_DragDelta" />

private void ResizeGripper_DragDelta(object sender, DragDeltaEventArgs e)
{
    Width -= e.HorizontalChange;
}

欲了解更多信息:https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/how-to-resize-a-canvas-by-using-a-thumb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2021-11-07
    • 2011-01-15
    相关资源
    最近更新 更多