wpf 如何设置WrapPanel内部控件的边距

cdmah0mi  于 2023-06-07  发布在  其他
关注(0)|答案(5)|浏览(628)

下面是我使用的一个例子:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <WrapPanel Orientation="Horizontal" TextElement.FontSize="30" TextElement.FontStyle="Italic"  >
        <Button Content="test1" Margin="10,0" Padding="10,10" />
        <Button Content="test2" Margin="10,0" Padding="10,10" />
        <Button Content="test3" Margin="10,0" Padding="10,10" />
        <Button Content="test4" Margin="10,0" Padding="10,10" />
        <Button Content="test5" Margin="10,0" Padding="10,10" />
    </WrapPanel>
</StackPanel>

如您所见,我的换行面板有几个按钮。每个按钮都有相同的边距和填充。
问题是,有没有一种方法可以为wrap面板设置margin和padding,这样wrap面板中的每个元素都可以使用它的值?
对于设置内部元素的字体,我可以使用“TextElement”附加属性提供程序。有没有类似的方法可以设置内部控件的边距和填充?
这使代码更短,让我指定边距和填充只有一次,而不是设置它的每个控制面板。
谢谢你!

mwyxok5s

mwyxok5s1#

James Hay提供的解决方案是实现您所需结果的最简单方法。
然而,还有其他可能的解决方案:
1.您可以为WrapPanel实现自己的附加属性/行为,为它的所有子节点设置Margin和/或Padding。详情请参见this CodeProject article by Josh Smith
1.您可以创建自己的面板,它继承自WrapPanel,只需添加所需的属性并覆盖适当的方法,以便为所有子元素设置Margin/Padding
1.您还可以将Style定义从Window.Resources移动到WrapPanel.Resources,从Style中删除x:Key属性,并从所有Button中删除Style="{StaticResource ButtonStyle}"。这样,Style被应用到 * 所有 * Button,它们是WrapPanel的子节点。如果您还有其他控件作为子控件,则可以将StyleTargetType更改为适当的公共基类型(例如FrameworkElement):

<StackPanel>
  <WrapPanel Orientation="Horizontal">
    <WrapPanel.Resources>
      <Style TargetType="{x:Type Button}">
        <Setter Property="Margin" Value="10,0" />
        <Setter Property="Padding" Value="10,10" />
      </Style>
    </WrapPanel.Resources>

    <Button Content="test1" />
    <Button Content="test2" />
    <Button Content="test3" />
    <Button Content="test4" />
    <Button Content="test5" />
  </WrapPanel>
</StackPanel>

但是,请注意,这将影响WrapPanel中的 * 所有 * Button示例,而不仅仅是它的直接子示例!

pjngdqdw

pjngdqdw2#

另一个很好的方法可以在这里看到:http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx
它展示了如何创建一个附加的行为,以便像这样的语法可以工作:

<StackPanel local:MarginSetter.Margin="5">
   <TextBox Text="hello" />
   <Button Content="hello" />
   <Button Content="hello" />
</StackPanel>

这是为面板的几个子面板设置边距的最简单、最快速的方法,即使它们不是同一类型。(即按钮、文本框、组合框等)

huus2vyu

huus2vyu3#

WrapPanel没有任何向其所有子级添加填充或边距的属性。您可能需要的是每个按钮共享的样式。类似于:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
            <Setter Property="Margin" Value="10,0" />
            <Setter Property="Padding" Value="10,10" />
        </Style>
    </Window.Resources>

    <StackPanel>
      <WrapPanel Orientation="Horizontal"  >
         <Button Content="test1" Style="{StaticResource ButtonStyle}" />
         <Button Content="test2" Style="{StaticResource ButtonStyle}" />
         <Button Content="test3" Style="{StaticResource ButtonStyle}" />
         <Button Content="test4" Style="{StaticResource ButtonStyle}" />
         <Button Content="test5" Style="{StaticResource ButtonStyle}" />
       </WrapPanel>
    </StackPanel>
   </Window>
vshtjzan

vshtjzan4#

下面是一个自定义的WrapPanel控件,它添加了ItemMargin依赖项属性。

/// <summary>
/// A wrap panel which can apply a margin to each child item.
/// </summary>
public class ItemMarginWrapPanel : WrapPanel
{
    /// <summary>
    /// ItemMargin static DP.
    /// </summary>
    public static readonly DependencyProperty ItemMarginProperty =
        DependencyProperty.Register(
        "ItemMargin",
        typeof( Thickness ),
        typeof( ItemMarginWrapPanel ),
        new FrameworkPropertyMetadata(
            new Thickness(),
            FrameworkPropertyMetadataOptions.AffectsMeasure ) );

    /// <summary>
    /// The margin that will be applied to each Item in the wrap panel.
    /// </summary>
    public Thickness ItemMargin
    {
        get
        {
            return (Thickness)GetValue( ItemMarginProperty );
        }
        set
        {
            SetValue( ItemMarginProperty, value );
        }
    }

    /// <summary>
    /// Overridden. Sets item margins before calling base implementation.
    /// </summary>
    /// <param name="constraint"></param>
    /// <returns></returns>
    protected override Size MeasureOverride( Size constraint )
    {
        RefreshItemMargin();

        return base.MeasureOverride( constraint );
    }

    /// <summary>
    /// Overridden. Sets item margins before calling base implementation.
    /// </summary>
    /// <param name="finalSize"></param>
    /// <returns></returns>
    protected override Size ArrangeOverride( Size finalSize )
    {
        RefreshItemMargin();

        return base.ArrangeOverride( finalSize );
    }

    /// <summary>
    /// Refresh the child item margins.
    /// </summary>
    private void RefreshItemMargin()
    {
        var children = InternalChildren;
        for( int i = 0, count = children.Count; i < count; i++ )
        {
            var ele = children[i] as FrameworkElement;
            if( null != ele )
                ele.Margin = ItemMargin;
        }
    }
}

现在你可以做:

<Style
    x:Key="MarginWrapPanelStyle"
    TargetType="{x:Type mycustomcontrols:ItemMarginWrapPanel}">
    <Setter
        Property="ItemMargin"
        Value="5" />
</Style>
9cbw7uwe

9cbw7uwe5#

如果面板中的项目不多,您可以使用Line控件,并在WrapPanel的情况下给予宽度,在StackPanel的情况下为其指定高度。然后,您可以设置线条的样式。

<WrapPanel Orientation="Horizontal"  >
     <Button Content="test1" />
     <Line Width="15" />
     <Button Content="test2" />
     <Line Width="15" />
     <Button Content="test3" />
   </WrapPanel>

相关问题