c# - WPF C#中自定义用户控件的绑定
问题描述
我制作了一个自定义 UserControl,在 ProgressBar 中显示文本,显示由“showPercentage”布尔值定义的百分比或时间。
XAML
<UserControl x:Class="ProgressBar.ProgressBarText"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ProgressBar"
mc:Ignorable="d"
d:DesignHeight="20" d:DesignWidth="100">
<Grid>
<Rectangle x:Name="pBorder" Fill="LightGray" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="Black" StrokeThickness="1"/>
<Rectangle x:Name="pFill" Fill="Green" Stroke="Transparent" StrokeThickness="2" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="100"/>
<Viewbox>
<Label x:Name="pLabel" HorizontalAlignment="Center" VerticalAlignment="Center" Content="Test"/>
</Viewbox>
</Grid>
</UserControl>
C# 代码
using ...
namespace ProgressBar
{
/// <summary>
/// Interaktionslogik für ProgressBarText.xaml
/// </summary>
public partial class ProgressBarText : UserControl
{
public int Value { get; set; }
public bool showPercentage { get; set; }
public double percentage { get; set; }
public int Maximum { get; set; }
public ProgressBarText()
{
InitializeComponent();
}
public void getValues()
{
if (Maximum != 0)
{
percentage = ((double)Value / Maximum) * 100;
pFill.Width = this.Width * percentage / 100;
if (showPercentage == true)
{
pLabel.Content = percentage.ToString() + "%";
}
else
{
int Days = (int)(Maximum - Value) / 60 / 24;
int Hours = (int)((Maximum - Value) - (Days * 24 * 60))/60;
int Minutes = (int)((Maximum - Value) - (Hours * 60) - (Days * 24 * 60));
if (Days > 0)
{
pLabel.Content = Days.ToString() + "d " + Hours.ToString() + "h " + Minutes.ToString() + "m";
}
else
{
if (Hours > 0)
{
pLabel.Content = Hours.ToString() + "h " + Minutes.ToString() + "m";
}
else
{
pLabel.Content = Minutes.ToString() + "m";
}
}
}
}
}
}
}
在我的 MainWindow 中,我得到了一个 ListView,它应该使用我的自定义控件为每个 Name 显示一行。我制作了一个名为“Progress”的自定义类
列表视图 XAML
<ListView x:Name="lvProgress" Grid.Column="1" Margin="10">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}">
</GridViewColumn>
<GridViewColumn Header="ProgressValue">
<GridViewColumn.CellTemplate>
<DataTemplate>
<local:ProgressText Value="{Binding ProgressValue}" Maximum="{Binding ProgressMax}" Width="100" Height="15" showPercentage="false"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Datum}"/>
</GridView>
</ListView.View>
</ListView>
C# 进度类
List<Progress> SeriesCollection = new List<Progress>();
public class Progress{
public string pbName { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public int ProgressValue { get; set; }
public int ProgressMax { get; set; }
public string DateFinished { get; set; }
public void GetChanges()
{
foreach(Progress progress in SeriesCollection)
{
progress.Update();
}
lvProgress.ItemsSource = SeriesCollection;
}
public void AddListItem(string name, int baketime, DateTime date)
{
SeriesCollection.Add(new Progress() {pbName="pb"+name, Name = name,CreateDate = date, ProgressMax = baketime, ProgressValue = (int)TimeSpan.FromTicks(DateTime.UtcNow.Ticks - date.Ticks).TotalMinutes, DateFinished = date.AddDays((int)(baketime/60/24)).ToString("dd.MM.yyyy HH:mm") });
}
}
这对我不起作用。我尝试将 ProgressText 属性设置为 DependencyProperties,但这也不起作用。
有没有简单的方法来解决这个问题。解释自定义用户控件的文章或书籍也很受欢迎。
谢谢马克斯
解决方案
推荐阅读
- sql - 分解对象列,连接结果并将它们添加到原始行
- api - Microsoft Teams 导出 API 查询
- django - 来自多 PostgreSQL 模式的 Django 查询
- python - PyCharm 重新格式化代码不会将行换行到指定长度
- python - 从列表中随机选择,而不以功能/副作用自由方式不等概率分布返回
- java - It is a good practice to ignore .project file in Git if I am using different versions of Eclipse
- vba - How to download a link in the pdf format directly using VBA both in IE or Chrome using Selenium?
- server - Amp Page 在 PageSpeed Insights 上得分不高
- javascript - 单击按钮后如何获取数组的下一个项目?
- python - 使用 ffn 时获取“column_names 必须与代码长度相同”