WPF根据子控制位置计算父级边际

时间:2012-06-13 14:47:05

标签: wpf rulers

我有以下XAML。我必须根据子控件(CanvasRuler)左侧位置将余量设置为LabelEditFrame。我该怎么做。

   <wpfcommon:CanvasNavigationBar>
        <DockPanel>
            <wpfcommon:CanvasRuler />     <!-- Horizontal -->
            </wpfcommon:CanvasRuler  />   <!-- Vertical -->
            <border>
                <StackPanel>
                    <wpfcommon:LabelEditFrame>
                    </ wpfcommon:LabelEditFrame>
                </StackPanel>
            </border>
        </DockPanel>
    </wpfcommon:CanvasNavigationBar>

现在我有了这个

enter image description here

我想要这个(我可以通过设置硬编码值来实现,但我需要动态设置它,所以如果子控件的位置发生变化,它会自动改变标尺位置

enter image description here

2 个答案:

答案 0 :(得分:0)

我建议你把所有东西都放到网格上,并允许它为你计算任何东西:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="SomeFixedHeightToGetTopMargin"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition  Width="SomeFixedWithToGetLeftMargin"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <wpfcommon:CanvasRuler Grid.Column="1"/>
    <wpfcommon:CanvasRuler Grid.Row="1"/>
    <Border Grid.Row="1" Grid.Column="1">
        <StackPanel>
            <wpfcommon:LabelEditFrame/>
        </StackPanel>
    </Border>
</Grid>

答案 1 :(得分:0)

根据我的经验,如果这是在画布上并且是画布上的孩子,则可以使用

Canvas.SetLeft

Canvas.SetTop

方法

因此,对于标尺,您可以设置:

VerticalAlignment="Top", HorizontalAlignment="Left

然后当移动LabelEditFrame时(无论你使用哪个事件触发),你可以用这样的东西调整两个标尺:

Canvas.SetLeft(HorizontalCanvasRuler, LabelEditFrame.Margin.Left);
Canvas.SetTop(VerticalCanvasRuler, LabelEditFrame.Margin.Top);

我没有尝试过这个,但我以前习惯调整这样的控件,所以应该可以工作:)