0

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

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

为了做到这一点,我设置了Widthtoauto然后MinWidthto 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直接应用于TextBox设计器(或在 xaml 中),那么在重新设置样式时会按预期增长,但我不希望发生的原始样式也是如此。

我在这里想念什么?

4

2 回答 2

2

我只是猜测你正在设置TextBox.Width类似的东西<TextBox Width="150" .../>,如果是这样的话,根据依赖属性设置优先级列表 Style不会覆盖你的固定值。尝试像这样设置初始Width值:

<TextBox>
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <Setter Property="Width" Value="150" />
      </Style>
   </TextBox.Style>
</TextBox>
于 2013-06-10T09:09:09.597 回答
0

dkozl 的答案正是它不起作用的原因,也是我打算使用的解决方案。

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

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

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

于 2013-06-10T09:25:46.657 回答