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