Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
在 Avalonia(也许还有 WPF)中,为什么同一个 MainWindow 有两个不同的 ViewModel 实例?
在MainWindow的代码隐藏的构造函数中,定义一个MainWindowViewModel并将其分配给DataContext。 构造函数代码 然后MainWindow中有两个按钮,其中一个按钮的Click是...
我有一个用户控件,我想在特定时间为其设置动画。我将其中两个用户控件添加到窗口中。我使用该窗口中的按钮来启动动画。用户控件之一...
如何在WPF中将List绑定到Listview userControl?
我正在尝试使用指定的 userControl UI 创建数据库中产品的 ListView。 这是我的清单。 我正在尝试使用指定的 userControl UI 创建数据库中产品的 ListView。 这是我的清单。 <ListView x:Name="ProductTable" Background="Transparent" ItemsSource="{Binding GetProducts}"> <ListView.ItemTemplate> <DataTemplate> <v:ProductLineStyle/> </DataTemplate> </ListView.ItemTemplate> <ItemsControl></ItemsControl> </ListView> 我尝试通过使用 XAML 代码中的 ItemSource 属性或在代码隐藏中将其绑定到我在代码隐藏中的列表。 ProductTable.Items.Clear(); ProductTable.ItemsSource = GetProducts(); 但我最后总是得到空列表项。 我检查了我想要绑定多次的列表,它不为空。 起初我尝试从ListView更改为ListBox,但它不起作用,我尝试使用userControl后面的代码作为产品类,但似乎userControl的构造函数不应该有参数,所以我使用了另一个上课,因为这样会更容易。 这就是我现在的用户控件中的代码 public ProductLineStyle() { InitializeComponent(); this.DataContext = this; } public string ProductID { get; set; } public string ProductName { get; set; } public int ProductPrice { get; set; } public int ProductQTé { get; set; } 这是 XAML 脚本 <Rectangle HorizontalAlignment="Stretch" RadiusX="10" RadiusY="10" Fill="#2A3E50"> </Rectangle> <DockPanel> <TextBlock x:Name="ID" Text="{Binding ProductID}" FontFamily="Inter Semi Bold" Margin="10" FontSize="20" Foreground="#01161E" VerticalAlignment="Center" Width="130" HorizontalAlignment="Left"/> <TextBlock x:Name="Product" Text="{Binding ProductName}" FontFamily="Inter Semi Bold" Margin="10" MaxWidth="400" FontSize="20" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Left"/> <TextBlock x:Name="Qte" Text="{Binding ProductQTé}" FontFamily="Inter Semi Bold" Width="50" FontSize="20" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Right" DockPanel.Dock="Right" Margin="0,0,10,0"/> <TextBlock x:Name="Price" Text="{Binding ProductPrice}" FontFamily="Inter Semi Bold" Margin="10,10,30,10" MaxWidth="400" FontSize="20" Foreground="White" VerticalAlignment="Center" DockPanel.Dock="Right" HorizontalAlignment="Right"/> </DockPanel> 这是我正在使用的课程。 internal class Product { public Product(string ID, string Name, int Price, int Qty) { ProductID = ID; ProductName = Name; ProductPrice = Price; ProductQTé = Qty; } public string ProductID { get; set; } public string ProductName { get; set; } public int ProductPrice { get; set; } public int ProductQTé { get; set; } } 您必须将ProductLineStyle内的DataTemplate控件与ItemsControl的项目连接起来。您必须将 ProductLineStyle 绑定到 Product 项目。 但是为了能够做到这一点,在 ProductLineStyle 控件中定义的所有属性都必须定义为依赖属性。不允许您将绑定分配给非依赖属性。 接下来,因为 Product 类是绑定源,所以它必须实现 INotifyPropertyChanged。如果不这样做,就会造成内存泄漏。 请勿对ItemsControl.ItemsSource进行操作。而是对源集合进行操作。除此之外, ItesControl.Items.Clear 调用是多余的,只会增加性能成本。它强制集合的完整迭代,以便逐项删除。此操作使用项目索引。这意味着,集合越大,清除集合所需的时间就越长。如果您打算更换集合,则不必事先清除它。 在 WPF 中,您无法绑定到方法。以下代码不起作用: <ListView x:Name="ProductTable" ItemsSource="{Binding GetProducts}" /> 您只能绑定到公共属性。 即使绑定有效,您也可以通过显式代码隐藏赋值来删除/覆盖它: // Overrides the binding declared in XAML ProductTable.ItemsSource = GetProducts(); 使用其中之一。更喜欢数据绑定。 还有另一个重要的细节:永远不要在内部设置控件的 DataContext。特别是当该控件需要在其一个或多个属性上定义 Binding 时。 这将破坏所有外部数据绑定: <Grid> <Grid.DataContext> <Product Id="Abc" /> </Grid.DataContext> <!-- Binding is unexpectedly broken and won't resolve, because the ProductStyle internally changes the value of DataContext: 'DataContext = this;' --> <ProductStyle ProductId="{Binding Id}" /> </Grid> 外部绑定通常针对当前DataContext。没有人预料到这个值会被控件默默地操纵。 关键是依赖属性引擎将自动从父级继承正确的 DataContext 值。 在您的场景中,该父项是 ListBoxItem,继承的值是 Product 项。现在您可以轻松地将 ProductStyle 控件绑定到当前 DataContext,即 Product。绑定将按预期运行 要修复代码,您必须更改类设计和实现。 产品.cs // This type must implement INotifyPropertyChanged. // If this type had been a child of DependencyObject // it would have to implement properties as dependency properties instead. internal class Product : INotifyPropertyChanged { // Use the common and recommend C# naming conventions // which states that fields and parameter names // must use camelCase. PascalCase is only for types and properties and events. public Product(string id) { this.ProductId = id; } protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => this.PropertyChanged?.Invoke(this, new PropertyChangedArgs(propertyName)); public string Id { get; set; } public event PropertyChangedEventHandler PropertyChanged; } MainWindow.xaml.cs partial class MainWindow : Window { public ObservableCollection<Product> Products { get; } public MainWindow() { InitializeComponent(); this.Products = new ObservableCollection<Product> { new Product("A112"), new Product("B543") }; } } MainWindow.xaml <Window> <ListBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Products}"> <ListBox.ItemTemplate> <ProductLineStyle ProductId="{Binding Id}" /> </ListBox.ItemTemplate> </ListBox> </Window> ProductStyle.xaml.cs class ProductLineStyle : UserControl { public string ProductId { get => (string)GetValue(ProductIdProperty); set => SetValue(ProductIdProperty, value); } public static readonly DependencyProperty ProductIdProperty = DependencyProperty.Register( "ProductId", typeof(string), typeof(MainWindow), new PropertyMetadata(default)); public ProductLineStyle() { InitializeComponent(); // Don't do this. This will break your external data bindings // (the data bindings defined on the ProductStyle element)! // The correct DataContext value will be automatically inherited from the parent. // In this scenario, the parent is the ListBoxItem and the value the Product type. //this.DataContext = this; } } 产品样式.xaml <UserControl> <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ProductId}" /> </UserControl>
使用 WPF 尝试在用户下载中创建目录和子目录,但出现访问被拒绝错误
私有无效CreateDirectories() { //定义backupFolderDirectory的路径 字符串 backupFolderDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ...
这可能很容易做,也可能很难,但是任何人都可以向我建议如何设计像这样的图片的滚动查看器 在设计领域,我对 WPF 还很陌生。我才知道这个设计...
我有一个WPF窗口,它显示文件夹(ListView)的内容,并实现了将文件从窗口拖放到桌面或资源管理器窗口(使用GongSolutions Dra...
使用 ItemsControl 时是否有东西可以拉伸以填充所有剩余空间
我制作了一个简单的自定义控件来包含一些参数,并将所有这些控件放入 ItemsControl 中,如下所示。 我尽了最大的努力来拉伸物品以填充所有剩余空间,...
我正在开发一个类似于 dropbox 的应用程序,我在 WPF 列表视图上显示远程文件。我想将这些元素拖放到 Windows 资源管理器中。 我见过这样的代码: var dataO...
如何在RichTextbox中获取准确的光标位置以显示Popup
我想在WPF中显示RichTextBox的POPUP特定位置。我知道有一种方法可以通过以下代码行在 winforms RichTextBox 中获得相同的效果。 点点=richText...
我尝试在我的应用程序中创建最近的文件子菜单。我的代码基于 https://www.itcodar.com/csharp/wpf-how-to-create-menu-and-submenus-using-binding.html 的示例 当我尝试使用
如何在自定义组合框控件的下拉列表末尾添加“AddNew”按钮?
我有一个带有组合框的自定义控件。我想在下拉列表的末尾添加一个按钮,上面写着“AddNew”,例如“AddNewStudent”,单击该按钮时,会打开一个表单
如何获取当前鼠标在屏幕上的坐标? 我只知道 Mouse.GetPosition() 可以获取元素的 mousePosition,但我想在不使用元素的情况下获得协调。
我在列表视图中有一个复选框: 我在列表视图中有一个复选框: <ListView x:Name="listCertificate" HorizontalAlignment="Left" Margin="15,15,0,0" VerticalAlignment="Top" Width="350"> <ListView.View> <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="InfoPaquet"> <GridViewColumn Header="Checked"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding Checked}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding NotBefore}"> <GridViewColumnHeader>Valid From</GridViewColumnHeader> </GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding NotAfter}"> <GridViewColumnHeader>Valid To</GridViewColumnHeader> </GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding Subject}"> <GridViewColumnHeader>Subject</GridViewColumnHeader> </GridViewColumn> </GridView> </ListView.View> </ListView> 现在我也想添加一项功能,当我选中一个复选框时,所有其他复选框都将被禁用。基本上一次只能勾选一个复选框。 我的问题是如何获得我单击的一个复选框: $hash.listCertificate = $hash.Window.FindName('listCertificate') $hash.listCertificate.Add_PreviewMouseLeftButtonDown({ param([System.Object]$sender, [System.EventArgs]$Event) Write-Host $Event.OriginalSource.text Write-Host $Event.SelectedIndex }) hash.listCertificate.View.Columns[0].Add_Click({ HandleCheckBoxChecked $_ }) 我尝试了不同的方法,但它们都是错误的。另外我不太确定如何了解像 Add_Click 这样的函数。 尝试: <GridViewColumn Header="Checked"> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton IsChecked="{Binding Checked}" GroupName="listCertificateGroup"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn>
我有WinUI 3应用程序,有4个元素:App.xaml(.cs),MainWindow.xaml(.cs),LoadingPage.xaml(.cs)和RegularContentPage.xaml(.cs)。 我的任务是:虽然 App.xaml.cs 中的代码做了一些工作...
如何通过 MVVM 为 DataGrid ItemSource 设置过滤器
我有一个 DataGrid 绑定到 XAML 中的 CollectionViewSource。 我有一个 DataGrid 绑定到 XAML 中的 CollectionViewSource。 <Window.Resources> <local:MainWindowViewModel x:Key="ViewModel"/> <CollectionViewSource x:Key="cvsEntries" Source="{Binding LogEntriesStore, Source={StaticResource ViewModel}}"/> </Window.Resources> LogEntriesStore 是一个 ObservableCollection (LogEntry 是一个 DTO,在本次讨论中并不重要) DataGrid 声明为: <DataGrid AutoGenerateColumns="False" Margin="0" Name="dataGrid1" ItemsSource="{Binding Source={StaticResource cvsEntries}}" IsReadOnly="True"> 现在,我在这个 DataGrid 中的各个单元格上都有上下文菜单,以启动过滤请求。右键单击一个单元格,然后选择筛选器来筛选所有行,并仅显示此特定值。 MVVM 获取要过滤的请求,但现在是棘手的一点。如何在 CollectionViewSource 上设置过滤器? (顺便说一句 - 这就像在公园里用 Silverlight 散步一样轻松 PagedCollectionView,但 WPF 中似乎不提供这种功能,是吗?) 非常简单。您只需将集合视图移动到视图模型中即可: 在MainWindowViewModel中定义类型为ICollectionView的属性: public ICollectionView LogEntriesStoreView { get; private set; } 初始化 LogEntriesStore 属性后,您需要使用以下代码初始化 LogEntriesStoreView 属性: LogEntriesStoreView = CollectionViewSource.GetDefaultView(LogEntriesStore); 然后您需要从 XAML 中删除 CollectionViewSource 并修改 ItemsSource 绑定以指向新创建的集合视图属性: <DataGrid AutoGenerateColumns="False" Margin="0" Name="dataGrid1" ItemsSource="{Binding LogEntriesStoreView, Source={StaticResource ViewModel}}" IsReadOnly="True"> 就是这样。现在您可以访问视图模型内的集合视图,您可以在其中修改过滤器。 您的问题有多种解决方案,但在我看来,最好的解决方案是仅使用标准 WPF DataGrid 控件的样式,而不发明新的继承 DataGird 类型或依赖于其他第三方控件。以下是我找到的最佳解决方案: 选项 1:我个人使用:自动 WPF 工具包 DataGrid 过滤 选项 2:Microsoft WPF DataGrid 自动筛选 我还有一个问题。我也这样做。但是我现在如何处理 ObservableCollection 中模型的属性更改呢?无论如何,它不会在模具视图中刷新。
我希望能够在文本框中写入一个数字(最好仅从 1 到 10),并在数据网格中为其创建一定数量的列。我怎样才能做到这一点?这就是我所拥有的...
如何让PasswordBox在错误验证时显示错误消息(并删除红色框)?
有几个关于错误验证的线程。然而,如果要将我的代码组合在一起,我就会失败。我对 WPF 的理解还很遥远。因此,您的帮助、建议和审查我...
SystemIdentification.GetSystemIdForPublisher 为所有项目返回相同的硬件 ID
基于 MS 文档 SystemIdentification.GetSystemIdForPublisher 应该为同一台计算机返回相同的 Id,只要发布者相同。 文档: 返回的标识符...
是否有更具体/深入的选项可以使用 aspire XLS 库更改 Excel 文件的打印区域?
我正在生成一个文件,但打印区域不太准确。我怎样才能将该虚线移动到下一行?有没有实际存在的方法? 虚线应该是直线...