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

时间:2019-09-17 09:02:42

标签: c# wpf xaml

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

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

我停留在这一点上,因为我要沿着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>

我希望能够获得所有ObjA切换按钮并进行TransformToAncestor检查...除非有更好的方法?

我也可以在后面的查看代码中执行此操作,但是不确定这是否有点顽皮...

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

0 个答案:

没有答案