C# UWP-以编程方式在ItemTemplate中显示进度条
我正在为Windows Mobile构建一个UWP应用程序,但我在进度条上遇到了一些障碍。我在应用程序发布的第一页上找到了一个,这很好,但现在我正试图在GridView中显示一个。我将有N个GridView控件在屏幕上的任何时间,并希望显示一个进度条在每个 这对数据绑定很好,数据会显示出来,但当我试图在文本块之前添加一个不确定的ProgressBar时,它似乎没有显示出来。我只能假设我把它放错地方了,或者我做得不对,因为我的GridView使用的是C# UWP-以编程方式在ItemTemplate中显示进度条,c#,xaml,gridview,uwp,uwp-xaml,C#,Xaml,Gridview,Uwp,Uwp Xaml,我正在为Windows Mobile构建一个UWP应用程序,但我在进度条上遇到了一些障碍。我在应用程序发布的第一页上找到了一个,这很好,但现在我正试图在GridView中显示一个。我将有N个GridView控件在屏幕上的任何时间,并希望显示一个进度条在每个 这对数据绑定很好,数据会显示出来,但当我试图在文本块之前添加一个不确定的ProgressBar时,它似乎没有显示出来。我只能假设我把它放错地方了,或者我做得不对,因为我的GridView使用的是GridView.ItemTemplate 以下
GridView.ItemTemplate
以下是一些屏幕截图:
用答案更新
在贾斯汀·XL的帮助下,我终于找到了问题的症结所在。我绑定到一个普通的clr属性,而不是DependencyProperty。我将代码更改为使用MVVM,并将IsLoaded属性设置为处理通知UI的操作。以下是我的更新和工作代码:
ViewModel.cs
公共类视图模型
{
公共字符串名称{get;set;}
}
MainPageViewModel.cs
public类MainPageViewModel:INotifyPropertyChanged
{
公共ObservableCollection MyData{get;set;}=new ObservableCollection();
已加载私人布尔;
公共布尔值已加载
{
获取{return\u isLoaded;}
设置
{
_isLoaded=值;
OnPropertyChanged();
}
}
公共异步任务GetDataAsync()
{
//将项目添加到MyData
IsLoaded=true;
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
MainPage.xaml.cs
公共密封部分类主页面:第页
{
公共主页()
{
初始化组件();
DataContext=新的MainPageViewModel();
}
公共MainPageViewModel Vm=>DataContext作为MainPageViewModel;
受保护的覆盖异步无效OnNavigatedTo(NavigationEventArgs e)
{
基地。导航到(e);
等待Vm.GetDataAsync();
}
}
MainPage.xaml
App.xaml
反向检查可视性转换器.cs
public class InvertIsCheckedVisiblityConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、字符串语言)
{
bool isChecked=(bool)值;
返回isChecked?可见性。折叠:可见性。可见;
}
公共对象转换回(对象值、类型targetType、对象参数、字符串语言)
{
返回null;
}
}
如果您想要一个位于网格视图
中心的进度条
,您需要将网格视图
包装在网格
中,并将进度条
放在网格视图
的顶部。像这样的-
<Grid>
<GridView />
<ProgressBar x:Name="StatusBar"
IsIndeterminate="True"></ProgressBar>
</Grid>
<ControlTemplate TargetType="GridView">
<Grid BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<ScrollViewer x:Name="ScrollViewer"
AutomationProperties.AccessibilityView="Raw"
BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
TabNavigation="{TemplateBinding TabNavigation}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
<ItemsPresenter FooterTransitions="{TemplateBinding FooterTransitions}"
FooterTemplate="{TemplateBinding FooterTemplate}"
Footer="{TemplateBinding Footer}"
HeaderTemplate="{TemplateBinding HeaderTemplate}"
Header="{TemplateBinding Header}"
HeaderTransitions="{TemplateBinding HeaderTransitions}"
Padding="{TemplateBinding Padding}" />
</ScrollViewer>
<ProgressBar x:Name="StatusBar"
IsIndeterminate="{Binding IsHitTestVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InvertBoolConverter}}" />
</Grid>
</ControlTemplate>
更新 为了简化,您还可以将
ProgressBar
包装在GridView
样式中。首先只需基于默认样式生成一个新样式,然后转到其控制模板
,将根面板从边框
更改为网格
,然后只需在那里放置一个进度条
,如下所示-
<Grid>
<GridView />
<ProgressBar x:Name="StatusBar"
IsIndeterminate="True"></ProgressBar>
</Grid>
<ControlTemplate TargetType="GridView">
<Grid BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<ScrollViewer x:Name="ScrollViewer"
AutomationProperties.AccessibilityView="Raw"
BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
TabNavigation="{TemplateBinding TabNavigation}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
<ItemsPresenter FooterTransitions="{TemplateBinding FooterTransitions}"
FooterTemplate="{TemplateBinding FooterTemplate}"
Footer="{TemplateBinding Footer}"
HeaderTemplate="{TemplateBinding HeaderTemplate}"
Header="{TemplateBinding Header}"
HeaderTransitions="{TemplateBinding HeaderTransitions}"
Padding="{TemplateBinding Padding}" />
</ScrollViewer>
<ProgressBar x:Name="StatusBar"
IsIndeterminate="{Binding IsHitTestVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InvertBoolConverter}}" />
</Grid>
</ControlTemplate>
您的代码没有显示
ProgressBar
的任何大小。如果未明确指定宽度,则应指定非零的高度
,并至少将水平对齐
设置为中心
。如果您需要更多的帮助,请修复您的问题,使其包含一个可靠地再现问题的良好工具。ProgressBar是从另一个工作正常的页面复制和粘贴的,还是在DataTemplate中使用它更具体一点?我会试一试的,可以是任何东西。如果没有看到一个for each,它准确地表示了复制/粘贴的源代码以及如何使用粘贴的代码,我就无法确切地说明为什么它在一个地方工作而在另一个地方不工作。例如,可能原始源在某个地方声明了一个样式,将维度应用于ProgressBar
。(顺便说一句,我在上面的评论中打错了……我的意思是建议水平对齐,而不是居中;只拉伸