Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检索相对于控件的按钮位置_C#_Wpf_Xaml - Fatal编程技术网

C# 检索相对于控件的按钮位置

C# 检索相对于控件的按钮位置,c#,wpf,xaml,C#,Wpf,Xaml,我有一个包含动态创建的按钮的网格 我有一个选择器工具,可以选择一个“矩形”的按钮,并对其执行任何操作 我被困在这一点上,因为我要走MVVM的路线。。但我以前有一个所有按钮的列表,我会: var buttonPos = button.TransformToAncestor(someGrid).Transform(new Point(0, 0)); 现在,我不能奢侈地让itemscontrol中的所有按钮都这样做(或者至少我不知道怎么做) 这是我的XAML的一部分 <Grid Name=

我有一个包含动态创建的按钮的网格

我有一个选择器工具,可以选择一个“矩形”的按钮,并对其执行任何操作

我被困在这一点上,因为我要走MVVM的路线。。但我以前有一个所有按钮的列表,我会:

  var buttonPos = button.TransformToAncestor(someGrid).Transform(new Point(0, 0));
现在,我不能奢侈地让itemscontrol中的所有按钮都这样做(或者至少我不知道怎么做)

这是我的XAML的一部分

<Grid Name="mainGrid" DockPanel.Dock="Left" MouseDown="MainGrid_MouseDown" MouseUp="MainGrid_MouseUp" MouseMove="MainGrid_MouseMove" Background="Transparent" 
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                              MinWidth="{Binding GridWidth}" Height="{Binding GridHeight}">
                            <ItemsControl x:Name="ObjItemControl" ItemsSource="{Binding ObjCompositeCollection}">
                                <ItemsControl.ItemContainerStyle>
                                    <Style>
                                        <Setter Property="Grid.Row" Value="{Binding Row}"/>
                                        <Setter Property="Grid.Column" Value="{Binding Column}"/>
                                    </Style>
                                </ItemsControl.ItemContainerStyle>
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Grid DockPanel.Dock="Top" HorizontalAlignment="Stretch" 
                                         VerticalAlignment="Stretch" Name="objGrid" Grid.Row="1" 
                                         Width="{Binding MinWidth, ElementName=mainGrid}" 
                                         Height="{Binding Height, ElementName=mainGrid}"
                                         engine:GridHelper.RowCount="{Binding RowCount}"
                                         engine:GridHelper.ColumnCount="{Binding ColumnCount}" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.Resources>
                                    <DataTemplate DataType="{x:Type engine:ObjA}">
                                        <ToggleButton Content="{Binding Id}"
                                                Tag="{Binding Id}"
                                                IsChecked="{Binding IsSelected}"
                                                Height="{Binding ElementName=ObjItemControl, 
                                            Path=DataContext.ButtonHeightWidth}"
                                                Width="{Binding ElementName=ObjItemControl, 
                                            Path=DataContext.ButtonHeightWidth}"
                                                HorizontalAlignment="Stretch"
                                                VerticalAlignment="Stretch"
                                                Margin="{Binding ElementName=wellPlateItemControl, 
                                            Path=DataContext.ButtonMarginToUse}"
                                                Padding="2"
                                                PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown"
                                                PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp"
                                                MouseEnter="Button_MouseEnter"
                                                MouseLeave="Button_MouseLeave"
                                                Style="{StaticResource ObjButton}">
                                        </ToggleButton>
                                    </DataTemplate>
                                    <DataTemplate DataType="{x:Type engine:GridLabeller}">
                                        <TextBlock Text="{Binding HeaderName}" Style="{StaticResource GridHeaders}"/>
                                    </DataTemplate>
                                </ItemsControl.Resources>
                            </ItemsControl>
                            <ItemsControl ItemsSource="{Binding RectForMarquee}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Canvas/>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemContainerStyle>
                                    <Style TargetType="ContentPresenter">
                                        <Setter Property="Canvas.Left" Value="{Binding X}"/>
                                        <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                                    </Style>
                                </ItemsControl.ItemContainerStyle>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Rectangle Width="{Binding Width}" Height="{Binding Height}"
                                                   Visibility="{Binding Visibility}" 
                                                   Stroke="{StaticResource ResourceKey=SecondaryThemeColour}" 
                                                   StrokeThickness="2" StrokeDashArray="2,1"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                            <!--<Canvas>
                                <Rectangle x:Name="selectionBox" Visibility="Collapsed" Stroke="{StaticResource ResourceKey=SecondaryThemeColour}" StrokeThickness="2" StrokeDashArray="2,1"/>
                            </Canvas>-->
                        </Grid>

你还记得我建议的2d数组到observablecollection吗?如果你使用x和y索引,你可以计算出相邻的单元格。嘿,安迪。。。我记得你提到过这件事,但如果我完全诚实的话,我不太明白。。。。你有一个简单的例子吗?为什么相邻单元格也有?“将其设置为对象的observablecollection,并为空单元格添加emptyvm,为textblock添加textvm,为button添加buttonvm…等等。为itemscontrol资源中的每个元素添加一个数据模板。”这部分我不理解它的“外观”以及buttonVM如何链接到emptyVM以关联其位置如果你有一个3*2矩阵,那么你需要6个viewmodels。每个都被模板化到“单元”内的ui中。两个按钮和4个空仍然意味着6个虚拟机。我发布了一个链接,指向基于类型的datatemplates。再看一遍。定义包含按钮的数据模板。定义一个名为buttonvm的类。使用类似于我链接的示例中的数据类型,将firmer与后者关联起来。当buttonvm的实例作为数据模板化到按钮中的项遇到时。
    private void MainGrid_MouseUp(object sender, MouseButtonEventArgs e)
    {
        // Need to find a better way for this...
        List<UIElement> tgInItemControl = new List<UIElement>();
        foreach (var toggleButton in VisualHelperExtensions.FindVisualChildren<ToggleButton>(ObjItemControl))
        {
            tgInItemControl.Add(toggleButton);
        }

        viewModel.MainGrid_MouseUp(tgInItemControl, e);
    }