Xaml 如何在UWP&xFF1F中动态改变控件的宽度;
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: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每个项都不会自动划分宽度,然后我尝试使用数据绑定和值转换器动态提供宽度,绑定源是主网格的实际宽度,但实际宽度不会随窗口大小而改变,当窗口
请注意,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=""
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=""
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=""
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;
}