如何使用Caliburn Micro和WP8更新枢轴头间距

时间:2013-12-06 15:19:51

标签: windows-phone-7 windows-phone-8 caliburn.micro

我在使用带有Caliburn Micro和WP8的Pivot控件时遇到了一个问题。当我更新子ViewModels(透视项目)的DisplayName时,透视标题的间距不会更新以反映这一点。因此,枢轴标题彼此重叠,看起来非常混乱。

示例:

WP7版本: WP7 correct headers

WP8版本: WP8 incorrect headers

此问题仅在我们仅从目标WP7 / WP8迁移到WP8时开始。有没有人有任何关于如何在更改DisplayName时更新间距的想法,以及透视标题文本?谢谢!

2 个答案:

答案 0 :(得分:1)

我知道你问这个问题已经过了很长时间,但我得到了一个解决方案。

微软承诺在WP8中解决了这个问题,但它仍然没有。

为了正确呈现标题,您必须更改数据透视表项的宽度。

所以这是一个示例代码宽度x:Name =" PivotControl"设置为Pivot:

        double width = PivotControl.Width;
        double width2 = Application.Current.Host.Content.ActualWidth+10;

        PivotControl.Width = width2;
        await Task.Delay(1);
        PivotControl.Width = width;

这会将宽度更改为比yoru屏幕宽度稍微多一点,并且在1ms之后将其更改回来,以便正确呈现项目并更新布局(因为LayoutUpdate不起作用)。

答案 1 :(得分:0)

Here是更好的解决方案

Pivot标题模板:

    <!-- The SizeChanged event is key here. We have to invalidate an ancestor when we get this event. -->
    <DataTemplate x:Key="pivotHeaderTemplate">
        <TextBlock SizeChanged="OnHeaderSizeChanged" Text="{Binding SomeData}"/>
    </DataTemplate>

支点:

        <phone:Pivot Title="WHATEVER" 
                     DataContext="{StaticResource query}" 
                     ItemsSource="{Binding source}" 
                     HeaderTemplate="{StaticResource pivotHeaderTemplate}"
                     ItemContainerStyle="{StaticResource pivotItemStyle}"/>

代码隐藏:

    /// <summary>
    /// When something inside of the template changes, then we need to invalidate the measure of the ancestor PivotHeadersControl
    /// </summary>
    private void OnHeaderSizeChanged(object sender, SizeChangedEventArgs e)
    {
        FrameworkElement fe = (FrameworkElement)sender;
        while (fe != null)
        {
            if (fe is PivotHeadersControl)
            {
                fe.InvalidateMeasure();
                break;
            }
            fe = VisualTreeHelper.GetParent(fe) as FrameworkElement;
        }
    }