2013-10-08 127 views
4

我想用一個漂亮的TabHeader和TabContent模擬一個選項卡控件。控件應看起來像這樣:WPF負邊界不能正確顯示

desired header border

這是通過所述第一報頭的'保證金設置實現 - ‘HOME’到保證金=‘2 0 2 -1’。

ISSUE:如果我將窗口大小重新調整爲某個更小的寬度,則標題項目會直觀地剪切其內容。下面是結果:

undesired border

我真的想知道爲什麼發生這種情況,我怎麼CA避免這種情況。

樣品XAML來證明這個問題:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="550" Width="525"> 
<Grid Margin="0 50"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Border BorderThickness="1" BorderBrush="Black" Grid.Row="1"/> 

    <StackPanel Orientation="Horizontal" Grid.Row="0"> 
     <Border Width="50" Margin="2 0 2 -1" BorderThickness="1 1 1 0" BorderBrush="Black" Background="White"> 
      <TextBlock Text="HOME" /> 
     </Border> 
     <Border Width="150" Margin="2 -20" Height="20" BorderThickness="1 1 1 0" > 
      <TextBlock Text="EDIT" /> 
     </Border> 
    </StackPanel> 
</Grid> 

+0

想到一些想法: 1.沒有捕捉設備像素。 2.邊框在StackPanel之後呈現,因此它具有更高的z次序。 3. StackPanel繪圖區域不會失效,因此不會重繪。 想親自知道答案。 –

回答

2

當你調整窗口的大小,XAML渲染重繪任何柔性(仍然可以調整大小或相對移動)。當你達到StackPanel的寬度限制(被它包含的內容或固定寬度所限制)時,控件在重繪時(甚至包含它)會被忽略,並且渲染器不斷重繪其他靈活控件;在你的情況下:第一個邊界。這就是爲什麼突然出現在其他人的頭頂上。

移動緣至StackPanel的將這樣的伎倆:

<StackPanel Orientation="Horizontal" Grid.Row="0" Margin="2 0 2 -1"> 
      <Border Width="50" BorderThickness="1 1 1 0" BorderBrush="Black" Background="White"> 
       <TextBlock Text="HOME" /> 
      </Border> 
      <Border Width="150" Height="20" BorderThickness="1 1 1 0" > 
       <TextBlock Text="EDIT" /> 
      </Border> 
     </StackPanel> 
+0

@downvoter:你能解釋爲什麼downvoting? – HichemSeeSharp

+0

您所做的修改使Horizo​​ntal'StackPanel'小於最小窗口大小,並且不能再現問題,但它仍然存在。只需使標題文本稍長一些。 +1試圖幫助。 –

+0

@NovitchiS我更新了答案,希望它有幫助。 – HichemSeeSharp

1

這裏是2列

<Grid Margin="0,50"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="auto" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Border Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="Black" Grid.Row="1" /> 

    <StackPanel Orientation="Horizontal" Grid.Row="0"> 
     <Border Width="50" Margin="2,0,2,-1" BorderThickness="1,1,1,0" BorderBrush="Black" Background="White"> 
      <TextBlock Text="HOME" /> 
     </Border> 
     <Border Width="50" Margin="2" Height="20" BorderThickness="1,1,1,0" > 
      <TextBlock Text="EDIT" /> 
     </Border> 
    </StackPanel> 
</Grid> 

這使電網無法獲得通過窗口大小裁剪解決方案。

編輯添加了額外的列以將邊框推到邊緣。

乾杯, 埃裏克

+0

我不能失去將控件拉伸到所有可用水平空間的選項。不能使用你的解決方案,但它的工作原理。 –

+0

我修改了我的解決方案以擴展內容區域以水平拉伸。 – baueric

0

我推斷,這是在StackPanel佈局代碼的怪胎。您應該能夠通過移動負緣至StackPanel本身來解決它,內相對於標籤:

<Grid Margin="0 50" UseLayoutRounding="True"> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="auto" /> 
    <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Border BorderThickness="1" BorderBrush="#7FFF0000" Grid.Row="1" /> 
    <StackPanel Orientation="Horizontal" Grid.Row="0" Margin="0,0,0,-1"> 
    <Border Width="50" Margin="2 0 2 0" BorderThickness="1 1 1 0" BorderBrush="Lime" Background="Yellow"> 
     <TextBlock Text="HOME" /> 
    </Border> 
    <Border Width="150" Margin="2 0 2 0" Height="20" BorderBrush="Blue" BorderThickness="1 1 1 0" Background="Yellow"> 
     <TextBlock Text="EDIT" /> 
    </Border> 
    </StackPanel> 
</Grid> 

注意,我改變了顏色,以幫助可視化調試。這是一種有用的技術,但你可能想要將它們改回:)。