用户控制视图/窗口中的网格列宽

时间:2014-09-27 04:52:36

标签: c# wpf user-interface user-controls grid

我有一个地址用户控件,我在所有数据输入表格中使用此控件

两栏

  1. 标签
  2. 文本框contorls
  3. 我想根据其使用的视图调整1列

    User control

    例如

    这是使用用户控件的视图之一

    红色标记为查看网格列

    黄色标记为用户控件网格列

    有没有办法将黄色标记设置为等于红色标记的列宽?

    或者是否可以创建Dependency属性并将宽度绑定到列,或任何其他智能方法来解决此问题?

    View where user control is used

    XAML

     <Grid x:Name="LayoutRoot">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
    
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>           
        </Grid.RowDefinitions>
    
        <TextBlock Grid.Row="0" Grid.Column="0" Text="Full Name" Style="{StaticResource FormTextBlockStyle}" />
        <TextBox Grid.Row="0" Grid.Column="1" Width="200" Text="" Style="{StaticResource FormTextBoxStyle}" IsEnabled="False" IsReadOnly="True" />
    
        <TextBlock Grid.Row="1" Grid.Column="0" Text="Gender" Style="{StaticResource FormTextBlockStyle}" />
        <StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
            <RadioButton x:Name="RadioGendeMale" Content="Male" />
            <RadioButton Content="Female" Margin="8,0,0,0" />
        </StackPanel>
    
        <TextBlock Grid.Row="2" Grid.Column="0" Text="Date of Birth" Style="{StaticResource FormTextBlockStyle}" />
        <TextBox Grid.Row="2" Grid.Column="1" Width="200" Text="" Style="{StaticResource FormTextBoxStyle}" />
    
        <Controls:AddressControl x:Name="grdAdddress" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2"  HorizontalAlignment="Stretch" VerticalAlignment="Top"/>
    
    </Grid>
    

2 个答案:

答案 0 :(得分:1)

这里的主要问题是ColumnDefinition.ActualWidth不是DependencyProperty,如果你绑定它就不会更新。

我假设您不仅要将黄色设置为红色,还要同步到更大的宽度。如果您的情况是合理的静态(初始显示后第一列宽度没有变化),您可以使用它:

在UserControl中:

<Grid.ColumnDefinitions>
    <ColumnDefinition x:Name="Col1" Width="Auto"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

UserControl后面的代码:

public AddressControl()
{
    InitializeComponent();
    this.Loaded += AddressControl_Loaded;
}

void AddressControl_Loaded(object sender, RoutedEventArgs e)
{
    var parentGrid = this.Parent as Grid;
    if (parentGrid != null)
    {
        var width = Math.Max(this.Col1.ActualWidth, parentGrid.ColumnDefinitions[0].ActualWidth);

        this.Col1.Width = new GridLength(width);
        parentGrid.ColumnDefinitions[0].Width = new GridLength(width);
    }
}

对于更具动态性的情况,您必须处理SizeChanged个事件。

答案 1 :(得分:0)

试图让依赖属性处于控制状态并绑定它并不像adabyron所说的那样起作用。他的解决方案似乎还可