2014-04-15 118 views
0

我必須在同一行中顯示10個相同的用戶控件。每個控件將在左側包含產品圖像,右側將包含產品的名字,姓氏和類別。控件必須與它們之間的適當空間以及它們中的文本對齊,並且必須是可讀的。我在GridView行中使用了一個堆棧面板,每個控件給出窗口總寬度的10%。在我的代碼中的問題是,控件和控件中的文本之間沒有空格不可讀。60英寸屏幕上的多個控件的WPF屏幕顯示

<StackPanel Orientation="Horizontal" Grid.Row="3" VerticalAlignment="Bottom" Margin="0,0,5,0" > 

          <my:ScannedItemUserControl x:Name="ScannedProduct12" Margin="0,8,0,8" 
                 Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct12, 
             Path=ActualWidth, 
             ConverterParameter=0.06}" 
                 /> 
          <my:ScannedItemUserControl x:Name="ScannedProduct11" Margin="0,8,0,8" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct11, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct10" Margin="0,8,0,8" HorizontalAlignment="Right" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct10, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct9" Margin="0,8,0,8" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct9, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct8" Margin="0,8,0,8" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
          FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct8, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct7" Margin="0,8,0,8" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct7, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct6" Margin="0,8,0,8" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct6, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 
          <my:ScannedItemUserControl x:Name="ScannedProduct5" Margin="0,8,0,8" HorizontalAlignment="Right" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct5, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 
          <my:ScannedItemUserControl x:Name="ScannedProduct4" Margin="0,8,0,8" HorizontalAlignment="Right" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct4, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

          <my:ScannedItemUserControl x:Name="ScannedProduct3" Margin="0,8,0,8" HorizontalAlignment="Right" Width="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=MyWindow, 
             Path=ActualWidth, 
             ConverterParameter=0.1}" 
       FontSize="{Binding 
             Converter={StaticResource PercentageConverter}, 
             ElementName=ScannedProduct3, 
             Path=ActualWidth, 
             ConverterParameter=0.06}"/> 

         </StackPanel> 


public class PercentageConverter : IValueConverter 
{ 
    public object Convert(object value, 
     Type targetType, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     return System.Convert.ToDouble(value) * 
       System.Convert.ToDouble(parameter); 
    } 

    public object ConvertBack(object value, 
     Type targetType, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

這裏添加一些代碼,讓我們調查,這在我看來就像你需要你的'Grid'中添加容器和可能使用'ControlTemplate'添加統一的外觀,應用風格,它會給你完全控制你想如何顯示內容,觸發器會給你選擇添加一些效果。 – XAMlMAX

回答

1

一個堆疊面板將總是收縮,以適應其子的大小。

如果你不給的StackPanel的兒童的寬度和/或高度(取決於StackPanel中的方位),它們具有默認的寬度/ 0

高度時,只需提供在StackPanel中的項目適當的寬度和/或高度設置。

一個簡單的方法來獲得堆棧面板統一項目的間距是使用填充或邊距。

通過使用作用域樣式,可以輕鬆地爲堆棧面板內的某種類型的所有項設置默認填充/邊距(請參閱示例)。

<StackPanel orientation="vertical"> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Margin" Value="0,5,0,5"/> 
     </Style> 
    </StackPanel.Resources> 
    <Label height="32" horizontalAlignment="stretch"> visible label with spacing </Label> 
    <Label> invisible label (does have a margin though) </Label> 

</StackPanel> 
+1

這個答案的開頭語句有點誤導,而其餘的答案是好的。我認爲這個措辭有點令人困惑 - 它應該說「一個堆疊面板總是縮小到適合它的孩子的大小,它不會延伸到填充可用空間」。此外,對於這種佈局,根據我的經驗,最好使用網格,因爲它允許動態調整大小的內容,並且可以在各種分辨率下很好地縮放 – Charleh

+0

您是絕對正確的,將會修改答案。 –

+0

雖然我並沒有改變爲「使用網格」,因爲如果孩子的數量是可變的(或者更好,在這種情況下替換爲ItemsPanel),則可以將堆疊面板放置在滾動父級內。 op:如果面板中有* always * 10控件,則應考慮網格。 –