2017-02-20 2 views
2

Я хочу реализовать ручку изменения размера для своего инструмента. Я знаю, что могу активировать захват, установив ResizeMode="CanResizeWithGrip", но я хочу захватить его в сетке, которая видна только в режиме Hovering. я сделал сетку с изображениемWPF C#, реализующий изменение размера

<Grid x:Name="gridResize" Background="Transparent" Margin="236,235,0,0"> 
    <Image x:Name="resizeGrip" HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="27" Margin="37,35,0,0" 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; 
} 

ли кто-нибудь знает, как реализовать мышь вниз метод?

+0

Вы уверены, что не просто ищете это: http://www.wpf-tutorial.com/panels/gridsplitter/? –

+0

Несколько советов: используйте «Thumb» для изменения размера или/или перетаскивания. Он обеспечивает удобное использование события [Thumb.DragDelta] (https://msdn.microsoft.com/ru-ru/library/system.windows.controls.primitives.thumb.dragdelta (v = vs.110) .aspx), который предоставит вам дельтам перемещения мыши для X и Y. Если вы хотите изменить размер сетки или любого другого элемента пользовательского интерфейса, лучше используйте сетку с 3x3 rowsXcolumns и поместите 8 палец в боковые строки \ столбцы, чтобы вы упростили изменение размера для каждого направления. – Shakra

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

    } 


} 
+0

В случае, если я использую событие SizeChanged, чтобы убедиться, что окно будет сохранять свои Пропорции, если (diffX itskajo

Смежные вопросы