Wpf 从X和Y位置获取网格行和列

Wpf 从X和Y位置获取网格行和列,wpf,grid,row,Wpf,Grid,Row,我有一个网格,我知道我用鼠标点击的地方的X值和Y值 示例:X:235,Y:235-->这应该是第3列和第3行 如何得到x,y坐标上的列和行 我真的需要添加行/列的每个宽度,直到达到所需的x/y值吗 我正在使用WPF(用于我的网格)和c#(用于x&y位置) 有人能帮我吗?数学地板功能,例如: Math.Floor(235/scale) where scale is the the width or height of the grid cell. 定义: 返回小于或等于指定数字的最大整数。Mat

我有一个网格,我知道我用鼠标点击的地方的X值和Y值

示例:X:235,Y:235-->这应该是第3列和第3行

如何得到x,y坐标上的列和行

我真的需要添加行/列的每个宽度,直到达到所需的x/y值吗

我正在使用WPF(用于我的网格)和c#(用于x&y位置)


有人能帮我吗?

数学地板功能,例如:

Math.Floor(235/scale)
where scale is the the width or height of the grid cell.
定义:
返回小于或等于指定数字的最大整数。Math.ceil正好相反。

Math.Floor函数,例如:

Math.Floor(235/scale)
where scale is the the width or height of the grid cell.
定义:
返回小于或等于指定数字的最大整数。Ma.CeIL是相反的。

< P>。请考虑……p>
  • 您的网格有一些背景颜色集(即使是透明的也可以)。这是为点击测试(鼠标点击空白网格区域)工作
  • GridSplitter
    本身是网格中的成员。这一点很重要,因为单击栅格拆分器也会显示栅格拆分器所在的相应单元索引(列、行)
  • 这里我们不关心
    ColumnSpan
    RowSpan
  • XAML…

    <Window x:Class="WpfApplication3.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Mouse.PreviewMouseDown="Grid_MouseDown"
                  Background="Transparent">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
    
                <GridSplitter ResizeDirection="Rows"
                              Width="{Binding ActualWidth,
                                        RelativeSource={RelativeSource
                                              AncestorType=Grid}}"
                              Height="4" Grid.ColumnSpan="3"
                              Background="Red" Grid.Row="1" />                
                <TextBox Height="60" AcceptsReturn="True" 
                         Text="Element1"
                         ScrollViewer.VerticalScrollBarVisibility="Visible" />
                <Button Content="Element2" Grid.Column="1"/>
                <TextBlock Text="Element4" Grid.Row="2" Width="100"
                           Height="40" HorizontalAlignment="Left"
                           VerticalAlignment="Center"/>
                <ComboBox SelectedIndex="0" Height="20"
                          Grid.Column="1" Grid.Row="2">
                    <ComboBoxItem Content="Element5"/>
                </ComboBox>
                <CheckBox Content="Element3" Grid.Column="2"/>
                <RadioButton Content="Element6" Grid.Row="2"
                             Grid.Column="2" VerticalAlignment="Center"
                             HorizontalAlignment="Center"/>
            </Grid>
            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <TextBlock Text="Selected Column and Row is ... " Margin="5"/>
                <TextBlock x:Name="StatusTextBlock" FontSize="12"
                           FontWeight="SemiBold" Margin="5"/>
            </StackPanel>
        </Grid>
    </Window>
    
        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
        {
            int selectedColumnIndex = -1, selectedRowIndex = -1;
            var grid = sender as Grid;
            if (grid != null)
            {
                var pos = e.GetPosition(grid);
                var temp = pos.X;
                for (var i = 0; i < grid.ColumnDefinitions.Count; i++ )
                {
                    var colDef = grid.ColumnDefinitions[i];
                    temp -= colDef.ActualWidth;
                    if (temp <= -1)
                    {
                        selectedColumnIndex = i;
                        break;
                    }
                }
    
                temp = pos.Y;
                for (var i = 0; i < grid.RowDefinitions.Count; i++)
                {
                    var rowDef = grid.RowDefinitions[i];
                    temp -= rowDef.ActualHeight;
                    if (temp <= -1)
                    {
                        selectedRowIndex = i;
                        break;
                    }
                }
            }
    
            StatusTextBlock.Text = selectedColumnIndex + ", " + selectedRowIndex;
        }
    
    
    
    代码隐藏..

    <Window x:Class="WpfApplication3.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Mouse.PreviewMouseDown="Grid_MouseDown"
                  Background="Transparent">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
    
                <GridSplitter ResizeDirection="Rows"
                              Width="{Binding ActualWidth,
                                        RelativeSource={RelativeSource
                                              AncestorType=Grid}}"
                              Height="4" Grid.ColumnSpan="3"
                              Background="Red" Grid.Row="1" />                
                <TextBox Height="60" AcceptsReturn="True" 
                         Text="Element1"
                         ScrollViewer.VerticalScrollBarVisibility="Visible" />
                <Button Content="Element2" Grid.Column="1"/>
                <TextBlock Text="Element4" Grid.Row="2" Width="100"
                           Height="40" HorizontalAlignment="Left"
                           VerticalAlignment="Center"/>
                <ComboBox SelectedIndex="0" Height="20"
                          Grid.Column="1" Grid.Row="2">
                    <ComboBoxItem Content="Element5"/>
                </ComboBox>
                <CheckBox Content="Element3" Grid.Column="2"/>
                <RadioButton Content="Element6" Grid.Row="2"
                             Grid.Column="2" VerticalAlignment="Center"
                             HorizontalAlignment="Center"/>
            </Grid>
            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <TextBlock Text="Selected Column and Row is ... " Margin="5"/>
                <TextBlock x:Name="StatusTextBlock" FontSize="12"
                           FontWeight="SemiBold" Margin="5"/>
            </StackPanel>
        </Grid>
    </Window>
    
        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
        {
            int selectedColumnIndex = -1, selectedRowIndex = -1;
            var grid = sender as Grid;
            if (grid != null)
            {
                var pos = e.GetPosition(grid);
                var temp = pos.X;
                for (var i = 0; i < grid.ColumnDefinitions.Count; i++ )
                {
                    var colDef = grid.ColumnDefinitions[i];
                    temp -= colDef.ActualWidth;
                    if (temp <= -1)
                    {
                        selectedColumnIndex = i;
                        break;
                    }
                }
    
                temp = pos.Y;
                for (var i = 0; i < grid.RowDefinitions.Count; i++)
                {
                    var rowDef = grid.RowDefinitions[i];
                    temp -= rowDef.ActualHeight;
                    if (temp <= -1)
                    {
                        selectedRowIndex = i;
                        break;
                    }
                }
            }
    
            StatusTextBlock.Text = selectedColumnIndex + ", " + selectedRowIndex;
        }
    
    private void Grid\u MouseDown(对象发送器,MouseButtonEventArgs e)
    {
    int selectedColumnIndex=-1,selectedRowIndex=-1;
    var grid=发送方作为网格;
    如果(网格!=null)
    {
    var pos=e.GetPosition(网格);
    变量温度=位置X;
    对于(var i=0;i如果(温度P<P),请考虑……/P>
    
  • 你的网格有一些背景颜色设置(即使是透明的也可以)。这是为了进行点击测试(鼠标点击空白网格区域)
  • GridSplitter
    本身是网格中的成员。这一点很重要,因为单击网格拆分器还会显示网格拆分器所在的相应单元格索引(列、行)
  • 这里我们不关心
    ColumnSpan
    RowSpan
  • XAML…

    <Window x:Class="WpfApplication3.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Mouse.PreviewMouseDown="Grid_MouseDown"
                  Background="Transparent">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
    
                <GridSplitter ResizeDirection="Rows"
                              Width="{Binding ActualWidth,
                                        RelativeSource={RelativeSource
                                              AncestorType=Grid}}"
                              Height="4" Grid.ColumnSpan="3"
                              Background="Red" Grid.Row="1" />                
                <TextBox Height="60" AcceptsReturn="True" 
                         Text="Element1"
                         ScrollViewer.VerticalScrollBarVisibility="Visible" />
                <Button Content="Element2" Grid.Column="1"/>
                <TextBlock Text="Element4" Grid.Row="2" Width="100"
                           Height="40" HorizontalAlignment="Left"
                           VerticalAlignment="Center"/>
                <ComboBox SelectedIndex="0" Height="20"
                          Grid.Column="1" Grid.Row="2">
                    <ComboBoxItem Content="Element5"/>
                </ComboBox>
                <CheckBox Content="Element3" Grid.Column="2"/>
                <RadioButton Content="Element6" Grid.Row="2"
                             Grid.Column="2" VerticalAlignment="Center"
                             HorizontalAlignment="Center"/>
            </Grid>
            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <TextBlock Text="Selected Column and Row is ... " Margin="5"/>
                <TextBlock x:Name="StatusTextBlock" FontSize="12"
                           FontWeight="SemiBold" Margin="5"/>
            </StackPanel>
        </Grid>
    </Window>
    
        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
        {
            int selectedColumnIndex = -1, selectedRowIndex = -1;
            var grid = sender as Grid;
            if (grid != null)
            {
                var pos = e.GetPosition(grid);
                var temp = pos.X;
                for (var i = 0; i < grid.ColumnDefinitions.Count; i++ )
                {
                    var colDef = grid.ColumnDefinitions[i];
                    temp -= colDef.ActualWidth;
                    if (temp <= -1)
                    {
                        selectedColumnIndex = i;
                        break;
                    }
                }
    
                temp = pos.Y;
                for (var i = 0; i < grid.RowDefinitions.Count; i++)
                {
                    var rowDef = grid.RowDefinitions[i];
                    temp -= rowDef.ActualHeight;
                    if (temp <= -1)
                    {
                        selectedRowIndex = i;
                        break;
                    }
                }
            }
    
            StatusTextBlock.Text = selectedColumnIndex + ", " + selectedRowIndex;
        }
    
    
    
    代码隐藏..

    <Window x:Class="WpfApplication3.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Mouse.PreviewMouseDown="Grid_MouseDown"
                  Background="Transparent">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
    
                <GridSplitter ResizeDirection="Rows"
                              Width="{Binding ActualWidth,
                                        RelativeSource={RelativeSource
                                              AncestorType=Grid}}"
                              Height="4" Grid.ColumnSpan="3"
                              Background="Red" Grid.Row="1" />                
                <TextBox Height="60" AcceptsReturn="True" 
                         Text="Element1"
                         ScrollViewer.VerticalScrollBarVisibility="Visible" />
                <Button Content="Element2" Grid.Column="1"/>
                <TextBlock Text="Element4" Grid.Row="2" Width="100"
                           Height="40" HorizontalAlignment="Left"
                           VerticalAlignment="Center"/>
                <ComboBox SelectedIndex="0" Height="20"
                          Grid.Column="1" Grid.Row="2">
                    <ComboBoxItem Content="Element5"/>
                </ComboBox>
                <CheckBox Content="Element3" Grid.Column="2"/>
                <RadioButton Content="Element6" Grid.Row="2"
                             Grid.Column="2" VerticalAlignment="Center"
                             HorizontalAlignment="Center"/>
            </Grid>
            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <TextBlock Text="Selected Column and Row is ... " Margin="5"/>
                <TextBlock x:Name="StatusTextBlock" FontSize="12"
                           FontWeight="SemiBold" Margin="5"/>
            </StackPanel>
        </Grid>
    </Window>
    
        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
        {
            int selectedColumnIndex = -1, selectedRowIndex = -1;
            var grid = sender as Grid;
            if (grid != null)
            {
                var pos = e.GetPosition(grid);
                var temp = pos.X;
                for (var i = 0; i < grid.ColumnDefinitions.Count; i++ )
                {
                    var colDef = grid.ColumnDefinitions[i];
                    temp -= colDef.ActualWidth;
                    if (temp <= -1)
                    {
                        selectedColumnIndex = i;
                        break;
                    }
                }
    
                temp = pos.Y;
                for (var i = 0; i < grid.RowDefinitions.Count; i++)
                {
                    var rowDef = grid.RowDefinitions[i];
                    temp -= rowDef.ActualHeight;
                    if (temp <= -1)
                    {
                        selectedRowIndex = i;
                        break;
                    }
                }
            }
    
            StatusTextBlock.Text = selectedColumnIndex + ", " + selectedRowIndex;
        }
    
    private void Grid\u MouseDown(对象发送器,MouseButtonEventArgs e)
    {
    int selectedColumnIndex=-1,selectedRowIndex=-1;
    var grid=发送方作为网格;
    如果(网格!=null)
    {
    var pos=e.GetPosition(网格);
    变量温度=位置X;
    对于(var i=0;iif(计算单元格宽度的temp So idd:)Thx@Hmm,您假设网格在其单元格之间的间距相等。@AngelWPF您可以只应用于x和y,例如,x=Math.Floor(x/width)或y/width等。我认为@AngelWPF试图说的是您假设单元格的宽度和高度相等(通过分割)…在典型的
    网格中从来都不是这样的。在我的例子中,网格的宽度和高度相等。我将网格用作一个正方形,可以在其中移动控件。但是控件需要捕捉到我放置它们的行和列…因此idd计算单元格的宽度:) Thx@Hmm,您假设网格在其单元格之间的间距相等。@AngelWPF您可以只应用于x和y,例如,x=Math.Floor(x/width)或y/width等。我认为@AngelWPF试图说的是您假设单元格的宽度和高度相等(通过分割)…在典型的
    网格中从来就不是这样的。在我的例子中,网格的宽度和高度都是相等的。我把网格作为一个正方形,可以在其中移动控件。但是控件需要捕捉到我放置它们的行和列中…非常确定,你必须进行计算。听起来像是网格扩展方法的工作。@Kenny这是在我现在要做的xD中,我很确定你必须做数学题。听起来像是网格扩展方法的工作。@Kenny这就是我现在要做的xD