我有一个ItemsControl,它在Canvas上的散点图中绘制了数千个椭圆.我的问题是,如果我将椭圆定位在坐标(4,6)处,高度和宽度为10.椭圆的左上角是(4,6),形状向下和向右延伸.
我想做的是将椭圆中心放在XAML中的特定坐标上,而不必在我的ViewModel层中使用调整.
这是我的图表的工作UserControl:
<Grid>
<ItemsControl ItemsSource="{Binding State.Data}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas ClipToBounds="False"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Fill="Red" VerticalAlignment="Center" HorizontalAlignment="Center" Width="10" Height="20"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)
除了未经验证的椭圆外,这种方法效果很好.有任何想法吗?
关于在a中定位元素的常见问题Canvas是"如何定位元素的中心(而不是左上角)".
提出了几种解决方案,但它们都有缺点.
最简单的解决方案是在以编程方式设置Canvas.Left和Canvas.Top属性期间适应元素大小.这有效,但只有一次.此解决方案不支持绑定,并且在元素大小更改时会中断.您也无法设置Canvas.Left或Canvas.Top使用
另一套方案涉及转换的转换利用两种RenderTransform或Margin.这些解决方案需要将一些属性绑定到-0.5 * Width或-0.5 * Height.这种绑定需要创建自定义ValueConverter,并且不可能仅使用XAML创建.
那么,是否有一种简单的方法可以在画布中定位元素,使其Canvas.Left与Canvas.Top元素的中心对应,并且大小和位置属性都可以绑定到其他属性?
我想借助滑块在画布上调整一个圆圈.这个圆圈可以通过我在代码后面做的一些拖放操作在画布上移动,所以它的位置不固定.
我将滑块的值绑定到椭圆的高度和宽度.不幸的是,当我使用滑块时,圆圈的左上角点(实际上是它所在的矩形的左上角)在操作过程中保持不变.
我希望在操作期间使其中心点保持不变来调整它的大小.在XAML中有一个简单的方法吗?顺便说一下,我已经尝试过ScaleTransform,但它并没有完全按我的意愿行事.
谢谢你!:-)
一月
<Canvas x:Name="MyCanvas">
<!-- this is needed for some adorner stuff I do in code behind -->
<AdornerDecorator Canvas.Left="10"
Canvas.Top="10">
<Ellipse x:Name="myEllipse"
Height="{Binding Path=Value, ElementName=mySlider}"
Width="{Binding Path=Value, ElementName=mySlider}"
Stroke="Aquamarine"
Fill="AliceBlue"
RenderTransformOrigin="0.5 0.5">
<Ellipse.RenderTransform>
<RotateTransform Angle="{Binding Path=Value, ElementName=myRotationSlider}" />
</Ellipse.RenderTransform>
</Ellipse>
</AdornerDecorator>
<Slider x:Name="mySlider"
Maximum="100"
Minimum="0"
Width="100"
Value="10"
Canvas.Left="150"
Canvas.Top="10" />
<Slider x:Name="myRotationSlider"
Maximum="360"
Minimum="0"
Width="100"
Value="0"
Canvas.Left="150"
Canvas.Top="50" />
</Canvas>
Run Code Online (Sandbox Code Playgroud) 我在画布上有一个点,我想放置一个椭圆.我希望椭圆的中心超过这一点.此时,椭圆的左上角最左边是这一点.
我知道我可以在画布上以编程方式移动椭圆,但我想知道是否有办法告诉WPF将元素置于该点的中心而不是从左上角调整它的大小???