参考Grid内部的控制,设置Grid外部控件的边距

时间:2016-09-20 05:30:50

标签: wpf xaml

使用wpf解决方案

我创建了一个具有不同列的网格,在第2列中添加了一个控件。 现在我有一个外部网格控件,左边距应该与网格内的控件相同。 可以这样做吗?

2 个答案:

答案 0 :(得分:0)

我们当然可以采用非常简单的方式使用代码更改Margin

对于纯MVVM方法,您可以使用AttachedProperty来实现。

由于Binding类型不是Convertor,因此Thickness DependencyObject Margin将不起作用。

如果我们只是将外部Button的{​​{1}}绑定到内部Button,则外部Margin的整个Button会发生变化,这是我们不想要的。因此,除了Margin之外,我们需要保留整个Left Margin。可以使用Left Margin更改Binding。但是怎么样?我们的外Button需要有两个Margin值,一个原始值,另一个来自inner Button,因此原始值可以更改。对于这另一个边际,我们可以获得Attached Property的帮助,因为它们允许我们扩展控件。

<强> AttachedProperty

public static BindingExpression GetLefMargin(DependencyObject obj)
{
    return (BindingExpression)obj.GetValue(LefMarginProperty);
}

public static void SetLefMargin(DependencyObject obj, BindingExpression value)
{
    obj.SetValue(LefMarginProperty, value);
}

// Using a DependencyProperty as the backing store for LefMargin.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty LefMarginProperty =
    DependencyProperty.RegisterAttached("LefMargin", typeof(BindingExpression), typeof(Window1), new PropertyMetadata(null, new PropertyChangedCallback(MarginCallback)));

private static void MarginCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    FrameworkElement elem = d as FrameworkElement;
    BindingExpression exp = e.NewValue as BindingExpression;            

    // Create a new Binding to set ConverterParameter //

    Binding b = new Binding();
    b.Converter = exp.ParentBinding.Converter;
    b.ConverterParameter = elem.Margin;
    b.Path = exp.ParentBinding.Path;
    b.ElementName = exp.ParentBinding.ElementName;
    b.Mode = exp.ParentBinding.Mode;

    elem.SetBinding(FrameworkElement.MarginProperty, b);
}

<强>转换器

public class LeftMarginCnv : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double gridCtrlLeftMargin = ((Thickness)value).Left;
        Thickness tgtCtrlMargin = (Thickness)parameter;

        return new Thickness(gridCtrlLeftMargin, tgtCtrlMargin.Top, tgtCtrlMargin.Right, tgtCtrlMargin.Bottom);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<强>用法

<Grid>
    <Grid Background="Red" Margin="29,55,52,125" ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="90*"/>
            <ColumnDefinition Width="121*"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="Btn" Content="Press" Margin="18,22,35,28" Grid.Column="1" Click="Btn_Click"/>            
    </Grid>
    <Button local:Window1.LefMargin="{Binding Margin, ElementName=Btn, Converter={StaticResource LeftMarginCnvKey}}" Content="Button" HorizontalAlignment="Left" Margin="55,199,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>

如果您更改内部Button的左边距,则外Left Margin将更改其Button

答案 1 :(得分:0)

您可以为两者设置通用样式。这样的事情。

Parsing POMs
ERROR: Failed to parse POMs
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM: Failure to transfer my.package:project:pom:${project.version} from http://mynexus.com/content/groups/default was cached in the local repository, resolution will not be reattempted until the update interval of nexus-default has elapsed or updates are forced. Original error: Could not transfer artifact my.package:project:pom:${project.version} from/to nexus-default (http://mynexus.com/content/groups/default): Illegal character in path at index 78: http://mynexus.com/content/groups/default/my/package/project/${project.version}/panda-${project.version}.pom and 'parent.relativePath' points at wrong local POM @ line 26, column 10

(或)

简单明了

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="commonstyle" TargetType="{x:Type FrameworkElement}">
            <Setter Property="Margin" Value="10,0,0,0" />
        </Style>
    </StackPanel.Resources>
    <TextBox x:Name="outside" Width="100" Height="70" Style="{StaticResource commonstyle}"/>
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Button Width="100" Height="70" x:Name="inside" Grid.Column="2" HorizontalAlignment="Left" Style="{StaticResource commonstyle}"/>
    </Grid>
</StackPanel>

希望有所帮助。

相关问题