2012-01-04 48 views
6

我希望我的LOB表單中的標籤和文本框的字體大小隨窗口大小或分辨率更改而增大和縮小。爲了達到這個目的,我將標籤和文本框放在了視框內。文本框不會伸展以填充視圖框

標籤和自定義單選按鈕的行爲與我所期望的相同,但是文本框不會水平拉伸以填充視圖框(因爲代表無法發佈圖像)。如果您輸入內容,文本框將水平填充視圖框。

這裏是我與使用的代碼的一個例子:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.186*"/> 
      <ColumnDefinition Width="0.814*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.127*"/> 
      <RowDefinition Height="0.873*"/> 
     </Grid.RowDefinitions> 
     <Viewbox Margin="0,0,0.917,0"> 
      <Label Content="First name:"/> 
     </Viewbox> 
     <Viewbox Grid.Column="1"> 
      <TextBox TextWrapping="Wrap"/> 
     </Viewbox> 
    </Grid> 

我試圖將網格,和StackPanel中DockPanel中(與LastChildFill =「真」)的視框內,然後放置文本框在這些佈局控件中,但這也不起作用。無論如何,讓文本框水平填充父視圖框?

此問題與此類似:WPF TextBox won't fill in StackPanel但此問題與堆疊面板而不是視框有關。

+0

第一件事是讓你的xaml正確:你沒有爲每個網格項指定Column/row。 – GameAlchemist 2012-01-04 12:00:43

+1

@VincentPiel這其實並不重要。列和行默認爲0. – mydogisbox 2012-01-04 14:15:41

回答

10

我覺得你想要的是不容易的。 ViewBox告訴它的孩子他們有足夠的空間,通過佈局的措施。之後,顯示器將被放入視圖框中。現在一個文本框被告知有無限的空間,顯然無法伸展。 我有2個解決方案,我認爲這不是你想要的,但無論如何可能有幫助。

第一:

<Viewbox Grid.Column="1" Grid.Row="0" Stretch="Uniform" > 
    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}"> 
     <TextBox TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </Grid> 
</Viewbox> 

這樣能伸展你的TextBox逸岸,但禁止從視框中期望的行爲。爲什麼?我們告訴ViewBox保持寬高比,並將文本框設置爲填充視框的整個寬度,這保持了文本框的大小。

第二種:

將高度添加到網格,從標籤取出,用其視框的scaletransform修改。

這一個我沒有嘗試過,但它會涉及到一個值轉換器。

結論:由於視框佈置其子項的方式,沒有簡單的方法來實現你想要的。如果你只想水平拉伸,我的第一個解決方案工作正常,如果你想擴展。我的猜測是你必須自己做。

+1

有關綁定到AcutalWidth或ActualHeight的警告:「因爲ActualHeight是計算值,所以您應該意識到,可能會有多個或增量報告的更改,作爲各種操作的結果佈局系統。佈局系統可能正在計算子元素所需的度量空間,父元素的約束等等。「這可能會導致綁定ActualHeight或ActualWidth的任何綁定在每次調整大小時會多次觸發,如果也有這樣的話,這會對性能產生影響很多這些bindigs。 – mydogisbox 2012-01-04 14:29:48

+0

+1當然你是對的,它的價值指出,但在這種情況下,我不知道更好的解決方案。 – dowhilefor 2012-01-04 16:52:15

+0

哈哈!我沒有真正的寬度! – mydogisbox 2012-01-04 18:04:12

1

如果你想不工作是什麼/是不容易的,然後假貨:

<TextBox GotFocus="TextBox_GotFocus" HorizontalAlignment="Stretch" BorderThickness="0" Grid.Column="1"/> 
    <Viewbox HorizontalAlignment="Left" Stretch="Uniform" Grid.Column="1"> 
     <TextBox x:Name="NameTextBox" Width="50" TextWrapping="Wrap" Text="Text" BorderThickness="0"/> 
    </Viewbox> 

    private void TextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     NameTextBox.Focus(); 
     NameTextBox.SelectionStart = NameTextBox.Text.Length; 
    } 

基本上會發生什麼是另一個TextBoxViewbox後面,當後面TextBox獲得焦點,它切換焦點ViewboxTextBox。這會產生一些奇怪的調整大小,因爲你有相對大小的網格設置。你將需要玩弄你的網格列/寬度大小,直到你得到你想要的效果。