【问题标题】:Setting width, height of TextBlock behind code for variablesizedwrapgrid not displaying correctly在 variableizedwrapgrid 代码后面设置 TextBlock 的宽度、高度无法正确显示
【发布时间】:2012-07-09 03:23:26
【问题描述】:

我需要一些帮助来确认我发现了错误。

我正在为 Metro 的 xaml 创建一个“TagCloud”。没什么复杂的,应该很简单。

我在后面的代码中创建TextBlock 对象,然后将它们添加到VariableSizedWrapGrid 的子对象中

每个TextBlock都有不同的高度和宽度——这由testblock.Measure(size)决定,然后通过DesiredSize.WidthDesiredSize.Height设置宽度和高度

testblock.Measure(new Size(10000, 250));
        dWidth = Double.Parse(testblock.DesiredSize.Width.ToString());
        dHeight = Double.Parse(testblock.DesiredSize.Height.ToString());

问题是,当添加TextBlock 对象时,它们基本上是剪辑的,它们都锁定到一个单一的大小(基本上是WrapGrid 的行为)。本质上,VariableSizedWrapGrid 拒绝在其子元素中允许可变高度和宽度?我不知道为什么它会剪辑所有内容。

<VariableSizedWrapGrid x:Name="vswg" Orientation="Horizontal" Width="Auto" Height="200" Grid.Column="1"/>

IEnumerable<TextBlock> textBlocks = 
    (from cloudItem in cloudItems 
     select ConvertToTextBlock(cloudItem, fontWeight));

vswg.Children.Clear();

foreach (TextBlock t in textBlocks)
{
    vswg.Children.Add(t);
}

ConvertToTextBlock() 返回一个新的TextBlock,带有不同的文本和字体大小

我无法让VariableSizedWrapGrid 实际上拥有一个“可变大小”的子控件。也许我只是用错了?

【问题讨论】:

  • 您可以尝试将包装面板从 Silverlight 工具包移植到 WinRT。
  • @ToddMain,为了简化,您只需要一个标签云,您可以使用 itemsource 提供并为每个项目分配不同的字体大小?

标签: c# .net xaml windows-8 microsoft-metro


【解决方案1】:

试试这样的:

 <GroupStyle.Panel> <ItemsPanelTemplate > <VariableSizedWrapGrid x:Name="MyGrid" Orientation="Horizontal" MaximumRowsOrColumns="7"

ItemWidth="{Binding DataContext.ItemTemplateWidth, ElementName=pageRoot}"

ItemHeight="{Binding DataContext.ItemTemplateHeight, ElementName=pageRoot}"

></VariableSizedWrapGrid> </ItemsPanelTemplate> </GroupStyle.Panel> 

还可以考虑阅读:

  1. http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2012/09/14/windows-8-xaml-and-displaying-multiple-sized-items.aspx
  2. http://www.acnenomor.com/3756161p1/how-to-display-gridview-items-with-variable-width-in-window-8

【讨论】:

    【解决方案2】:

    尝试考虑使用 DataTemplate。

    VariableSizedWrapGrid 提供 ItemHeight 和 ItemWidth 属性。然后,您只能在“单元格”中选择项目的宽度和高度。因此,您可以选择适合 3 个单元格宽度和 1 个单元格高度的项目。

    你应该考虑阅读:http://blogs.u2u.be/diederik/post/2012/03/07/Databinding-to-the-VariableSizedWrapGrid-in-Windows-8-Metro.aspx

    【讨论】:

    • 我之前已经检查过这个解决方案...问题是 columnspan {binding width} 是未定义的变量...“cloudtag”中显示的文本可以是任何未定义的长度 - 如字体大小可以通过“计数”来改变,这不是很实用。这可行(如果您定义了固定的列跨度),但我想将 wrapgrid 视为 wpf wrappanel,只需将一个控件放到它上面,然后在它旁边放另一个 - 没有对齐,没有大小调整等。我只是要把这个写到另一个winrt限制。就像 style.triggers (我真的很想回来)
    • 使用未设置的宽度不是一个好习惯:您将失去 VariableSizedWrapGrid 的“虚拟”属性。防止有你的宽度定义的项目。如果您有很多项目,则渲染时间太长。
    【解决方案3】:

    改变这个:

    DesiredSize.Width.ToString() 
    

    到这里:

    Width.ToString()
    

    布局系统是一个复杂的三遍过程,当您通过说“代码中的DesiredSize”来控制“DesiredSize”值时,布局系统会负责。当您指定宽度时,布局系统将被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2012-09-20
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多