Xaml 如何在UWP&xFF1F中动态改变控件的宽度;

Xaml 如何在UWP&xFF1F中动态改变控件的宽度;,xaml,data-binding,uwp-xaml,tabbar,Xaml,Data Binding,Uwp Xaml,Tabbar,Tabbar是iOS和Android上非常常见的导航控件。但UWP似乎没有 我看到了一个例子()①,使用Pivot制作TabBar,效果非常好,我尝试过修改它,使TabBar在底部,内容在上部 我的项目是MasterDetail,Master部分是TabBar(即TabsStyle Pivot),Detail部分只是一个空白 现在我发现了一个大问题,TabBar每个项都不会自动划分宽度,然后我尝试使用数据绑定和值转换器动态提供宽度,绑定源是主网格的实际宽度,但实际宽度不会随窗口大小而改变,当窗口

Tabbar是iOS和Android上非常常见的导航控件。但UWP似乎没有

我看到了一个例子()①,使用Pivot制作TabBar,效果非常好,我尝试过修改它,使TabBar在底部,内容在上部

我的项目是MasterDetail,Master部分是TabBar(即TabsStyle Pivot),Detail部分只是一个空白

现在我发现了一个大问题,TabBar每个项都不会自动划分宽度,然后我尝试使用数据绑定和值转换器动态提供宽度,绑定源是主网格的实际宽度,但实际宽度不会随窗口大小而改变,当窗口位于WideState时,主零件将变为空白

那么,如何动态更改TabBarItem的宽度呢

各种窗口大小效果图(删除“()”):

(https://i.stack.imgur.com/3GE5t.png

(https://i.stack.imgur.com/FyQuX.png

(https://i.stack.imgur.com/pChwz.png

(https://i.stack.imgur.com/cib1l.png

XAML:


请注意,ActualWidth在UWP XAML模型中不是DependencyProperty,因此无法正确参与绑定(它不会通知更改)

因此,如果您希望像现在这样进行绑定,则需要以可绑定的方式公开ActualWidth。这样做的一个简单方法是显式地创建一个行为,该行为附加到目标元素(在您的例子中是pivot)的SizeChange事件,并返回它的ActualWidth/ActualHeight/RenderSize作为行为的依赖属性。然后,您的选项卡项将转而查看行为的实际宽度


(默认情况下不会这样做,可能是因为UWP XAML不支持只读依赖属性,而且绑定也很容易导致循环布局循环,如果您不小心的话,在进行布局舍入时)

您应该查看我构建的控件。;)我喜欢你的设计!谢谢我试过了,没问题,但有一个新问题,当应用程序启动时,某些TabBarHeader无法显示,或者显示部分(渲染失败?),然后更改应用程序大小,一切正常,为什么?很可能在附加行为时没有设置ActualWidth,而只是连接SizeChanged事件处理程序-这很好,这只是意味着在SizeChanged触发之前,ActualWidth可能仍然是0(默认值?)。因此,是的,要么从行为附加方法手动调用SizeChanged事件处理程序,要么调用用于更新ActualWidth的任何代码。我确信所有计算和绑定都是正常的,并且有几个标头无法呈现(从逻辑上讲,VisualTree显示了它的存在,并且具有正确的大小,等等)
 <Pivot x:Name="pivot"
               Style="{StaticResource TabsStylePivotStyle}">
            <PivotItem>
                <PivotItem.Header>
                    <local:TabHeader Width="{Binding ActualWidth, Converter={StaticResource AutoWidthConverter}, ElementName=pivot, Mode=OneWay}"
                                     Glyph="&#xE719;"
                                     Label="item 1" />
                </PivotItem.Header>
                <TextBlock Text="Content content content" />
            </PivotItem>

            <PivotItem>
                <PivotItem.Header>
                    <local:TabHeader Width="{Binding ActualWidth, Converter={StaticResource AutoWidthConverter}, ElementName=pivot, Mode=OneWay}"
                                     Glyph="&#xE721;"
                                     Label="item 2" />
                </PivotItem.Header>
                <TextBlock Text="Content content content" />
            </PivotItem>

            <PivotItem>
                <PivotItem.Header>
                    <local:TabHeader Width="{Binding ActualWidth, Converter={StaticResource AutoWidthConverter}, ElementName=pivot, Mode=OneWay}"
                                     Glyph="&#xE723;"
                                     Label="item 3" />
                </PivotItem.Header>
                <TextBlock Text="Content content content" />
            </PivotItem>
        </Pivot>
public object Convert(object value, Type targetType, object parameter, string language)
{
    return (double)value / 3;
}