WPF保持完美矩形形状的控制(装订宽度和高度)

WPF保持完美矩形形状的控制(装订宽度和高度),wpf,binding,shape,Wpf,Binding,Shape,目前,我正在努力使一个控件在WPF中显示为长方体形状,而无需生成代码。下面是一个我希望它看起来像什么的工作示例: <Grid> <Grid.RowDefinitions> <RowDefinition Height="120"/> <RowDefinition Height="3" /> <RowDefinition Height="*" /> </Grid.RowDefin

目前,我正在努力使一个控件在WPF中显示为长方体形状,而无需生成代码。下面是一个我希望它看起来像什么的工作示例:

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="120"/>
      <RowDefinition Height="3" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal">
      <Button Margin="6" VerticalAlignment="Stretch" Width="{Binding Path=ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}">
        <Grid>
          <Grid.RowDefinitions>
           <RowDefinition Height="*" />
           <RowDefinition Height="Auto" />
          </Grid.RowDefinitions>
          <Image Source="http://blog.joeclarmusic.com/images/rss-icon.jpg" />
          <TextBlock Foreground="Black" TextAlignment="Center" Grid.Row="1" FontSize="11" Text="{Binding Path=Name}" Margin="0, 5, 0, 0" HorizontalAlignment="Center" TextWrapping="Wrap" />
        </Grid>
      </Button>
    </StackPanel>
    <GridSplitter Grid.Row="1" Background="#DDDDDD" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
  </Grid>

好的,这一切都很酷。在我当前的设计中,我使用ItemsControl并显示图像列表。由于这样的列表可能超过窗口的宽度,所以我想在StackPanel周围添加ScrollViewer,其中垂直滚动条被禁用(因为我只希望它从左到右流动,所以我只需要水平滚动条)

添加ScrollViewer后:

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="120"/>
      <RowDefinition Height="3" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ScrollViewer>
      <StackPanel Orientation="Horizontal">
        <Button Margin="6" VerticalAlignment="Stretch" Width="{Binding Path=ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}">
          <Grid>
          <Grid.RowDefinitions>
           <RowDefinition Height="*" />
           <RowDefinition Height="Auto" />
          </Grid.RowDefinitions>
          <Image Source="http://blog.joeclarmusic.com/images/rss-icon.jpg" />
          <TextBlock Foreground="Black" TextAlignment="Center" Grid.Row="1" FontSize="11" Text="{Binding Path=Name}" Margin="0, 5, 0, 0" HorizontalAlignment="Center" TextWrapping="Wrap" />
         </Grid>    
        </Button>
      </StackPanel>
    </ScrollViewer>
    <GridSplitter Grid.Row="1" Background="#DDDDDD" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
  </Grid>

在我的计算机中以kaxaml 1.7.1运行时的上图:jonatan.nilsson.is/wpf_with_scrollviewer.jpg

如果您在Kaxaml(或WPF窗口/页面)中运行它,您的。我所做的唯一更改是在StackPanel周围添加ScrollViewer。其他一切都是一样的,为什么它在scrollviewer中不断变大呢

我做错了什么

编辑: 添加了第二个示例的结果图像。

编辑: 好的,我已经稍微修改了你的代码,我可以确认这个按钮确实是无限大的。我真的说不出为什么会这样。可能是一些内部测量被破坏了。我确实发现,使用任何面板控件作为按钮内容(本例中为网格)都会导致问题,StackPanel或DockPanel等也是如此。也许您最好不要将这些项放在按钮中,而是使用其他控件。它真的需要一个按钮吗

旧的:
按钮的高度不断变大,可能是因为网格单元本身不断变大。如果使用栅格拆分器调整栅格组件的大小,则按钮将假定其所在单元的整个高度。如果你解释一下它“不断变大”的情况,想想看,如果这是驻留在items控件中的东西,那么首先为什么要使用网格拆分器和空单元格呢

老的:
“现在会溢出高度继续变大”我想你指的是按钮的宽度和高度。这是因为宽度与高度成正比


如果您的意思是“不会溢出…”,那么这完全是另一个故事,与网格行的大小有关。也许您应该澄清您的实际问题是什么,并提供一些有效的XAML作为示例。(您文章中的XAML在按钮内容中缺少“”标记。

好的,我找到了解决方案。如果满足以下条件,则会发生此“行为”:

  • 按钮的内容包含一个图像
  • 宽度/高度对其高度/宽度具有约束力
  • 按钮内容高于其宽度(当绑定设置为高度->宽度时)
您可以很容易地进行测试。如果删除按钮内的所有内容。除图像外,整个内容“几乎”工作(如果使用GridSplitter使行高度变小,按钮不会变小,但会变大)

但是,如果随后将
Margin=“0,0,0,1”
添加到图像中,则会出现与之前相同的行为(即,它无限增长)

发生的事情基本上是这样的:

  • 按钮高度高于其宽度
  • 绑定可以看到它并使它更宽
  • 图像看到它变得更宽,并使自己更高,以保持其比例(在本例中为1:1)
  • 图像将自己推得更高
  • 按钮高度高于其宽度,请转至步骤2
  • 基本上,因为图像的行为是始终保持其比例。解决此“行为”是使按钮内容的宽度大于其高度。如果按钮内容的宽度大于其高度,则绑定将强制其宽度降低。这在某种程度上使图像行为正确

    在我的第二个示例中,添加以下示例:

    Margin="30 ,0" 
    
    形象化将解决it永无止境增长的问题


    我不确定我是否解释得很好,因此如果您有可能改进此解释的建议,请发表评论。

    抱歉,按钮中显然缺少了内容。我修复了代码,希望修复了问题的描述。抱歉,修复的XAML仍然没有指出您正在尝试做什么。从我的角度来看,一切都是错误的hing很好。在ScrollViewer中有一个带有图像的按钮。它都在一个“盒子”形状中。当我在计算机中运行它时(在kaxaml 1.7.1中),该按钮比ScrollViewer大得多。这是第一个没有ScrollViewer的示例的图像(我希望结果是什么样子):这是我在StackPanel周围添加ScrollViewer时计算机上的图像(第二个示例):注意,控件变得无限大。我必须添加MaxWidth=“1000”只是为了阻止它无限增长。是的,除非有另一个控件提供单击支持,否则它必须是一个按钮。我可以将Button height属性绑定到ScrollViewer.ActualHeight,这样可以防止控件无限增长。但是,如果我从按钮中删除Panel控件,并将图像保留为but在内容上,即使这样,它也不能100%工作。当高度改变时,按钮只会增长而不会收缩。如果向下移动GridSplitter,按钮会增长。如果向上移动GridSplitter,按钮将保持其当前大小,而不会相应收缩。这是一个奇怪的b