以下情形:
我使用gridview来显示分组数据。
我在文本块中添加了一个TextBlock 应包含此组中的项目数。 (例如)
(编辑:在我的场景中,我总是显示6个项目,并希望在HeaderTemplate的TextBlock子项中显示溢出)
如何从代码中访问各个组头以操作此TextBlock?
以下是结果示例:
这是我的GroupHeaderTemplate的简化示例:
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock x:name="overflow"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
所以我想为每个生成的组单独访问和操作“溢出”项目!
答案 0 :(得分:2)
这是你真正想要的。
首先编辑GroupStyle HeaderTemplate
<GridView.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Width="500" Margin="5,0,0,5">
<TextBlock HorizontalAlignment="Left">
<Run Text="{Binding Name}" />
<Run FontFamily="Segoe Ui Symbol" Text="" />
</TextBlock>
<TextBlock HorizontalAlignment="Right">
<Run Text="{Binding Children.Count, FallbackValue=0}" />
<Run Text="Items" />
</TextBlock>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid />
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</GridView.GroupStyle>
请注意我使用的是
VaraibleSizedWrapGrid
接下来,处理GridView的已加载事件
class SubtractConverter : IValueConverter
{
public double Amount { get; set; }
public object Convert(object v, Type t, object p, string l)
{ return System.Convert.ToDouble(v) - Amount; }
public object ConvertBack(object v, Type t, object p, string l)
{ throw new NotImplementedException(); }
}
private void GridView_OnLayoutUpdated(object sender, RoutedEventArgs e)
{
var grid = sender as GridView;
var converter = new SubtractConverter { Amount = 5 * 2 /* padding x2 */ };
foreach (GroupItem group in (grid.ItemsPanelRoot as Panel).Children)
{
var result = VisualTreeHelper.GetChild(group, 0);
while (!(result is Grid))
result = VisualTreeHelper.GetChild(result, 0);
var items = (result as Panel).Children.OfType<ItemsControl>()
.First().ItemsPanelRoot;
var binding = new Binding
{
Path = new PropertyPath("ActualWidth"),
Mode = BindingMode.OneWay,
Converter = converter,
Source = items,
};
var header = (result as Panel).Children.OfType<ContentControl>()
.First().ContentTemplateRoot as FrameworkElement;
header.SetBinding(FrameworkElement.WidthProperty, binding);
}
}
而且,presto!现在,您的标题大小完全符合组中项目的宽度。
要记住的事情(作为设计师):
TextTrimming
中的TextBox
解决此问题。 # items
可能在屏幕外。使用包含grid
。祝你好运!
答案 1 :(得分:0)
我终于通过使用VisualTreeHelperExtensions
设法获得了所需的元素首先,你必须通过Nuget安装XamlToolkit
然后为Extensions添加using指令:
using WinRTXamlToolkit.Controls.Extensions;
现在你可以在你的ui元素上使用更多的方法,其中一个是getDescendantsByType() 我用来获取我的gridview所有文本块元素。我在溢出的文本块中添加了一个标记,我在遍历gridviews后代时检查它,看看你自己:
private void ItemsGridView_Loaded(object sender, RoutedEventArgs e)
{
foreach (TextBlock element in this.myGridView.GetDescendantsOfType<TextBlock>())
{
if(element.Tag != null && element.Tag.Equals("itemCountBlock")){
element.Text = "Finally solved!";
}
}
}
这应该适用于任何ui元素和任何想要改变的属性。