如何在样式更改后让WPF TextBox自动调整大小?

时间:2013-06-10 08:55:14

标签: c# wpf textbox

我有一个标准的TextBox,其固定宽度为150TextWrapping设置为NoWrap,这使得控件的行为与旧的WinForms版本一样 - 这就是我想要的。

但是,当我单击一个按钮时,我希望将TextBox有效地“转换”为标签。为了省去多个控件,我决定最好通过将样式更改为标签来完成。其中大部分工作正常,除了我希望新样式自动调整控件的宽度以确保显示所有文本而无需使用鼠标拖动选择。

为了尝试这样做,我将Width设置为auto,然后将MinWidth设置为150,如下所示:

<Style x:Key="TypeConfusedTextBox" TargetType="{x:Type TextBox}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Padding" Value="3"/>
    <Setter Property="Height" Value="Auto" />
    <Setter Property="Width" Value="Auto" />
    <Setter Property="MinWidth" Value="150" />
    <Setter Property="IsTabStop" Value="False"/>
</Style>

然后我按钮点击分配如下:

textBox1.Style = (Style)FindResource("TypeConfusedTextBox");

问题是在更改样式后,控件只保留为150的固定宽度。如果我将相同的WidthMinWidth值直接应用于设计器(或xaml)中的TextBox,那么在重新设置时会按预期增长,但原始样式也是如此不想发生。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我只是猜测你设置TextBox.Width类似于<TextBox Width="150" .../>的情况,如果是这种情况那么,根据Dependency Property Setting Precedence List Style不会覆盖你的固定值。尝试像这样设置初始Width

<TextBox>
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <Setter Property="Width" Value="150" />
      </Style>
   </TextBox.Style>
</TextBox>

答案 1 :(得分:0)

dkozl的答案正是它无法正常工作的原因,也是我打算使用的解决方案。

然而,在我发布这个问题后,我继续尝试了一些不同的东西,其中一个是覆盖代码中的宽度值。所以只是为了演示一个替代方案,这就是我将按钮点击代码更改为:

textBox1.Style = (Style)FindResource("TypeConfusedTextBox");
textBox1.ClearProperty(WidthProperty);//this sets it to "Auto"
textBox1.MinWidth = 150;

同样,这只是一种替代方案,我不建议将其作为最佳方法。