【问题标题】:How to expand a control如何扩展控件
【发布时间】:2013-04-15 20:16:40
【问题描述】:

我有一个带有网格的 UserControl,其规格如下:

<Grid Name="fieldsGrid" Margin="15,0,0,10">
           <Grid.ColumnDefinitions>
               <ColumnDefinition Width="25"/>
               <ColumnDefinition Width="*"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
           </Grid.ColumnDefinitions>
</Grid>

第二列是感兴趣的列。它显示一个复选框,其文本包含在 TextBlock 中,如果它太长,则显示为 "Text..."。这是通过代码隐藏完成的(我有我的理由),如下所示:

CheckBox currentCheckbox = new CheckBox();
TextBlock block = new TextBlock();
block.MaxWidth = 100;
block.Text = text;
block.TextWrapping = TextWrapping.NoWrap;
block.TextTrimming = TextTrimming.WordEllipsis;
currentCheckbox.Content = block;
currentCheckbox.ToolTip = metaText;
currentCheckbox.SetValue(Grid.RowProperty, rowNumber);
currentCheckbox.SetValue(Grid.ColumnProperty, 1);
currentCheckbox.Margin = new Thickness(0, 10, 10, 0);
currentCheckbox.VerticalAlignment = VerticalAlignment.Center;
fieldsGrid.Children.Add(currentCheckbox);

问题是我想在调整 UserControl 大小时扩展此复选框,从而随着大小的增加显示更多文本。如何实现?

【问题讨论】:

  • This is accomplished through code-behind (I have my reasons) - 我严重怀疑你有正当的理由造成如此可怕的混乱。在 WPF 中,XAML 用于创建 UI。期间。
  • 好吧,既然你问了@HighCore - 他们不是这样的原因,而是我正在处理别人的代码,我不能改变太多。所以不幸的是,我不得不使用我所拥有的:/
  • 我听到了...我发现以正确的方式完全重构一个糟糕实施的 WPF UI 最终会更容易,即试图从这些 winforms 开发人员的黑客中获得一些不错的东西。
  • 我同意你的观点,但是修改它可能会给我带来麻烦,呵呵,所以更容易在沉默中受苦@HighCore :)

标签: c# .net wpf xaml wpf-controls


【解决方案1】:

你为什么不试试这个,然后删除代码隐藏?

<Grid Name="fieldsGrid"
      Margin="15,0,0,10">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="25" />
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
  </Grid.ColumnDefinitions>
  <CheckBox Grid.Column="1"
            Margin="0 10 10 0">
    <CheckBox.Content>
      <!--  Make a binding for the Text of TextBlock below  -->
      <TextBlock MaxWidth="{Binding ActualWidth,
                                    RelativeSource={RelativeSource FindAncestor,
                                                                   AncestorType={x:Type CheckBox}}}"
                 Text="Some Text LOng FFFFFFF DDDDDDDDDDDD"
                 TextTrimming="WordEllipsis"
                 TextWrapping="NoWrap" />
    </CheckBox.Content>
  </CheckBox>
</Grid>

这应该给你你正在寻找的行为,并完成你的代码隐藏所做的一切(你需要将文本的绑定排序到TextBlock ofc)

根据 OP 的特定要求(尽可能避免使用代码隐藏):

可以添加你得到的代码隐藏(最后)

currentCheckbox.SizeChanged += (sender, args) => block.MaxWidth = args.NewSize.Width;  // Subtract the checkbox indicator width from args.NewSize.Width here for accurate TextBlock Width measurement

Video Link

【讨论】:

  • 正如我上面在 cmets 中提到的,这是别人的代码,我必须保持原样,除了解决这个问题:/ 你能采用后面代码的解决方案吗?
  • 我添加了一个编辑,如果你有使用代码隐藏的限制,应该这样做
  • 它似乎可以工作,但是在增加后减小大小时,文本的最大宽度没有设置为较小的大小。如何从您在答案底部提供的代码中做到这一点?
  • 换句话说,在增加窗口大小时,复选框的文本也会增加。但是当我决定在这样做之后减小窗口的大小时,它并没有做相反的事情。
  • err 增加/减小窗口大小以更改复选框尺寸对我来说很好。如果我能找到捕获工具,我会发布一个视频链接
【解决方案2】:

这似乎对我有用。我使用 XAML 只是为了定义 CheckBox 和包含它的标签内容的 TextBlock,如下所示:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="603.433" Width="730.97">
    <Grid Name="fieldsGrid"
      Margin="15,0,0,10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="Column 1"></TextBlock>
        <TextBlock Grid.Column="2" Text="Column 3, a bit bigger"></TextBlock>
        <TextBlock Grid.Column="3" Text="0" x:Name="txtWidth"></TextBlock>
        <TextBlock Grid.Column="4" Text="Column 5, really really really big"></TextBlock>
        <CheckBox Grid.Column="1" x:Name="testChk"
            Margin="0 10 10 0">
            <CheckBox.Content>
                <TextBlock x:Name="txtForCheckBox"></TextBlock>
            </CheckBox.Content>
        </CheckBox>
    </Grid>
</Window>

然后代码隐藏看起来像这样:

公共主窗口() {

    InitializeComponent();
    testChk.SizeChanged += testChk_SizeChanged;

    txtForCheckBox.Text = "Some text, test, test, test.";
    txtForCheckBox.TextTrimming = TextTrimming.WordEllipsis;
    txtForCheckBox.TextWrapping = TextWrapping.NoWrap;
}

void testChk_SizeChanged(object sender, SizeChangedEventArgs e)
{
    txtForCheckBox.MaxWidth = testChk.ActualWidth;
    txtWidth.Text = testChk.ActualWidth.ToString();
}

希望对您有所帮助...

【讨论】:

  • 运气不好。我怀疑它与后面代码中的某些代码有关。
  • 会发生什么?我很好奇:)
  • 收听上面 Viv 邀请我的聊天室,他正在帮我解决问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多