在WPF中显示容器的动态宽度

时间:2019-02-26 10:59:33

标签: wpf

 <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="0.55*" />
        </Grid.ColumnDefinitions>
        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Background="Gray">
            <TextBlock x:Name="EmployeeNameTextBlock"                      
                               VerticalAlignment="Center"
                               Margin="50,0,0,0"                                      
                             FontSize="18"
                               RenderTransformOrigin="0.5,0.5"
                               Text="Content09asdfadsdsdasdfasd92168132 "                       
                               TextWrapping="NoWrap"                       
                            />
            <ToggleButton x:Name="btn"                                                                  
                                  HorizontalAlignment="Left"                                
                                  Margin="0,0,0,0" 
                                  VerticalAlignment="Center" 
                                  Height="30" 
                                  Width="30"  >
                Button
            </ToggleButton>
        </StackPanel>
        <Label Grid.Column="1" Background="Yellow" />
    </Grid>

这是我的代码,在显示切换按钮时遇到问题,有关当前显示和期望的信息,请参见下面的屏幕截图

条件 *即使内容较小或较大,按钮也应始终位于文本块的结尾 *如果内容大于容器,则文本框大小应停在按钮宽度减小之前。这样我们就可以在显示屏上看到切换按钮。如预期的屏幕截图所示。

结果屏幕截图长文本 Result Screenshot

结果屏幕截图小文本 enter image description here

预期的屏幕截图长文本 Expected screenshot

enter image description here

预期的屏幕截图小文本

请对此提供任何帮助

预先感谢

解决方案

 <Grid SizeChanged="Grid_SizeChanged">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="0.55*" />
        </Grid.ColumnDefinitions>
        <Border Name="rightBlk" Background="Green" Grid.Column="1" />
        <Grid VerticalAlignment="Center" Background="Gray">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <TextBlock x:Name="EmployeeNameTextBlock"                      
                       VerticalAlignment="Center"
                       Margin="50,0,0,0"
                       TextTrimming="CharacterEllipsis"
                       FontSize="18"
                       RenderTransformOrigin="0.5,0.5"
                       Text="Content09asasdfasdfd "                       
                       TextWrapping="NoWrap"  
                       Padding="0,0,30,0" 
                    />
            <ToggleButton x:Name="btn"       
                          HorizontalAlignment="Right"                                
                          Margin="0,0,0,0" 

                          VerticalAlignment="Center" 
                          Height="30" 
                          Width="30"  >
                Button
            </ToggleButton>

        </Grid>
        <Label Grid.Column="1" Background="Yellow" />
    </Grid>

隐藏代码

private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
        {            
            EmployeeNameTextBlock.MaxWidth = ((Grid)sender).ActualWidth - 50 - rightBlk.ActualWidth;
        }

感谢@lvan和@Neptune帮助我解决此问题。

2 个答案:

答案 0 :(得分:0)

您可以用网格替换StackPanel。这样,您就可以更好地控制分发,并且可以在将其余按钮分配给TextBlock之前,让Button优先获得其宽度的优先级:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="0.55*" />
</Grid.ColumnDefinitions>
<Grid VerticalAlignment="Center" Background="Gray">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="EmployeeNameTextBlock"                      
                       VerticalAlignment="Center"
                       Margin="50,0,0,0"
                       TextTrimming="CharacterEllipsis"
                       FontSize="18"
                       RenderTransformOrigin="0.5,0.5"
                       Text="Content09asdfadsdsdasdfasd92168132 "                       
                       TextWrapping="NoWrap"                       
                    />
    <ToggleButton x:Name="btn"       Grid.Column="1"                                                           
                          HorizontalAlignment="Left"                                
                          Margin="0,0,0,0" 
                          VerticalAlignment="Center" 
                          Height="30" 
                          Width="30"  >
        Button
    </ToggleButton>
</Grid>
    <Label Grid.Column="1" Background="Yellow" />
</Grid>

如果您想向用户指示缺少文本,则添加了属性TextTrimming,但是如果不需要,可以将其删除。

当宽度受到限制时,上面的代码将产生以下结果: enter image description here

答案 1 :(得分:0)

您可以通过编写代码并添加内容来获得所需的内容 MaxWidth="270"TextTrimming="CharacterEllipsis"到文本框

或海王星代码并进行更改 <ColumnDefinition Width="*" />设置为“自动”,并将MaxWidth="270"添加到文本框。

我认为如果不在文本框中设置MaxWidth,就无法做到这一点,但这意味着如果调整窗口大小,则必须重新计算。

要重新计算: 订阅主窗口大小更改事件:

SizeChanged += MainWindow_SizeChanged;在主窗口构造函数中或在xaml中

并添加到代码隐藏中:

private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
    EmployeeNameTextBlock.MaxWidth = StackPanelName.ActualWidth - btn.ActualWidth;
}

您可能需要使用.Width而不是实际宽度,也可以尝试使用列而不是堆栈面板,但这说明了您需要进行的重新计算。