Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
首先,我将 BitmapImage 加载到位于窗口上的 Image 控件中。 然后我使用图像控件,然后关闭窗口。 我一分钟做 2-3 次,我的记忆就充满了你......
WPF - 将 Listview 绑定为 rowdetailstemplate 的子元素
我需要了解如何在 RowDetailsTemplate 内绑定列表视图。 这是我的 XAML: 我需要了解如何在 RowDetailsTemplate 中绑定 listview。 这是我的 XAML: <Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TestWPF" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid Name="TestDataGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Code" Binding="{Binding Code}" /> <DataGridTextColumn Header="Description" Binding="{Binding Description}"/> </DataGrid.Columns> <DataGrid.RowDetailsTemplate> <DataTemplate> <Border Background="Transparent" BorderBrush="White" BorderThickness="1" CornerRadius="15" Margin="10"> <Grid Margin="5"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0"> <StackPanel Orientation="Horizontal"> <TextBlock Text="CurrentStyle: "/> <TextBlock Text="{Binding Cstyle}"/> </StackPanel> </StackPanel> <StackPanel Grid.Column="1" VerticalAlignment="Stretch"> <TextBlock Text="Available Styles"/> <ListView x:Name="styleList" Height="135" > <GridView> <GridViewColumn DisplayMemberBinding="{Binding sCode}" Header="Name"/> <GridViewColumn DisplayMemberBinding="{Binding sColor}" Header="Color"/> </GridView> </ListView> </StackPanel> </Grid> </Border> </DataTemplate> </DataGrid.RowDetailsTemplate> </DataGrid> </Grid> </Window> 这是我的隐藏代码: using System.Collections.Generic; using System.Windows; namespace TestWPF { /// <summary> /// Logica di interazione per MainWindow.xaml /// </summary> public partial class MainWindow : Window { public List<GridElement> GridList { get; set; } public MainWindow() { InitializeComponent(); GridList = new List<GridElement> { new GridElement { Code = "ABC", Description = "Description for ABC", Cstyle = "Current style ABC", AvailableStyles = new List<Styles> { new Styles() { sCode = "Styletest1-ABC", sColor = "blue" }, new Styles() { sCode = "Styletest2-ABC", sColor = "red" } } }, new GridElement { Code = "DEF", Description = "Description for DEF", Cstyle = "Current style DEF", AvailableStyles = new List<Styles> { new Styles() { sCode = "Styletest1-DEF", sColor = "white" }, new Styles() { sCode = "Styletest2-ABC", sColor = "black" } } } }; TestDataGrid.ItemsSource = this.GridList; } } public class GridElement { public string Description { get; set; } public string Code { get; set; } public string Cstyle { get; set; } public List<Styles> AvailableStyles { get; set; } } public class Styles { public string sCode { get; set; } public string sColor { get; set; } } } 但结果就是图中的样子。 这就是结果 我需要的是rowdetail中的listview根据我选择的主网格的行而变化。 因此,如果我单击第一行,我将看到列表视图中列出的 ABC 样式(即颜色,但显示什么并不重要),如果单击第二行,也会看到相同的样式。 谢谢您的帮助 解决方案 我报告我找到的问题解决方案,仅供参考: <ListView x:Name="styleList" Height="135" ItemsSource="{Binding AvailableStyles}" > <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding sCode}" Header="Name"/> <GridViewColumn DisplayMemberBinding="{Binding sColor}" Header="Color"/> </GridView> </ListView.View> </ListView> 您的代码几近完美。但是,发生这种情况是因为未设置 ListView 的 ItemsSource 属性,并且缺少 ListView.View 元素。以下是处理和解决此问题的方法。 绑定 ItemsSource 属性 ItemsSource 属性对于使用数据填充 ListView 至关重要。在您的情况下,您希望 ListView 显示每个 GridElement 的可用样式。通过将 ListView 的 ItemsSource 绑定到AvailableStyles 属性,您可以确保每行显示正确的数据。 通过设置 ItemsSource="{BindingAvailableStyles}",您可以告诉 ListView 使用当前 GridElement 中的AvailableStyles 集合作为其数据源。如果没有这个,ListView就没有数据可显示。 定义ListView.View ListView.View 属性对于定义要在 ListView 中显示的数据的布局和列是必需的。在本例中,GridView 用于定义 sCode 和 sColor 的列。 ListView.View 元素(特别是 GridView)定义 ListView 中每个项目的显示方式。它指定每个项目应显示两列:一列用于 sCode,一列用于 sColor。如果没有这个,ListView 将不知道如何渲染数据。 最终结果 最终的 WPF 将如下所示: <ListView x:Name="styleList" Height="135" ItemsSource="{Binding AvailableStyles}"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding sCode}" Header="Name"/> <GridViewColumn DisplayMemberBinding="{Binding sColor}" Header="Color"/> </GridView> </ListView.View> </ListView> 还有这样的应用程序: 我希望这有帮助!如果您还有任何疑问,请随时询问。
当我将 RoutedEventArgs 事件标记为“已处理”时,为什么会引发异常?
我试图将事件标记为已处理,但当我尝试这样做时会引发异常。 我有以下函数在 TextBox 的 LostFocus 事件上被调用: 私人空间
从 XAML 加载文件时,SfRichTextBoxAdv 表格边框的行为很奇怪
如果我尝试将文档保存到 xaml 文件,然后完全不修改它,将其加载回 SfRichTextBoxAdv,那么所有表格上的所有边框都会消失。 如果加载 xaml 文档后...
我需要拍摄一个网页的快照,该网页使用通过 EdgeHTML (Spartan) 视图引擎渲染的 JS Service Worker,该引擎可通过 WPF 和 UWP 中的 WebView 1 控件获得。 我在网络时遇到的问题...
我有一个WPF应用程序,每个窗口上都有多个控件,有些是重叠的等,我需要的是一种让应用程序根据屏幕分辨率自动调整自身大小的方法。 有什么想法吗?
我写了一些WPF编辑器,它显示文本。 但文本存储在 Stream 中。 所以,这里是 XAML 代码: 我写了一些WPF编辑器,它显示文本。 但文本存储在 Stream。 所以,这里是 XAML 代码: <TextBox Text="{Binding ObjectViewModel.Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 我将 UpdateSourceTrigger 设置为 PropertyChanged,因为用户可以在此编辑器中读取和写入一些文本; 这里读取和写入文本(作为流)的代码: public String Text { get { var sr = new StreamReader(StreamObject.text, Encoding.UTF8, true); return sr.ReadToEnd(); } set { lock (_lockObject) { var str = value; var textStream = new MemoryStream(); using (var writer = new BinaryWriter(textStream, Encoding.UTF8, true)) { writer.Write(Encoding.UTF8.GetBytes(str)); } textStream.Position = 0; StreamObject.text = null; StreamObject.text = textStream; textStream.Close(); } } } 因此,当用户输入新的字代码时,写入流新数据(清除旧流并创建新数据)。 但它的性能很慢。 我应该使用async(以某种方式)或其他方法来提高性能吗? 我知道,可以使用 LostFocus 属性,但这样用户应该失去 TextBox 的焦点。 我应该使用异步(以某种方式)或其他方法来提高性能吗? 确实有一个 async 版本的 ReadToEnd 方法,称为 ReadToEndAsync 但它实际上不会使你的代码更快,并且你不能从属性调用它,因为属性不能标记为 async。 每次更改属性时,在源属性的 getter 和 setter 中创建新的 Stream 是没有意义的。 您应该从流中读取once,例如在视图模型的构造函数或命令的 Execute 方法中,然后设置 string 属性的值。然后,在您实际需要将其保存到数据库时,将 string 转换回流 once,例如: class ViewModel { public ViewModel() { using (var sr = new StreamReader(StreamObject.text, Encoding.UTF8, true)) Text = sr.ReadToEnd(); } //this method is called when your "Save" button or similar is clicked public void SaveToDb() { lock (_lockObject) { var str = value; using (textStream = new MemoryStream()) { using (var writer = new BinaryWriter(textStream, Encoding.UTF8, true)) { writer.Write(Encoding.UTF8.GetBytes(str)); } textStream.Position = 0; StreamObject.text = null; StreamObject.text = textStream; } } } public String Text { get;set; } } 源属性本身不应该知道有关流的任何信息。
UserControl 未在 WPF ContentControl 中呈现
我是 WPF 和 MVVM 的新手。我花了两天时间浏览了一堆关于这个主题的问答,但我还没有成功地让它发挥作用。这不可避免地意味着这是愚蠢的事情......
自定义函数中不会发生Powershell事件Add_Checked、Add_Unchecked
由于我需要在 WPF 窗口中多次创建此模式,因此我创建了如下所示的函数。 函数 Group_WPF { 参数( [Windows.Controls.Canvas]$canvas, [int]$顶部, ...
在 Observable 集合中添加和删除项目时,出现 ObjectDispose 异常。 添加 如果我向集合中添加一个新项目,它工作正常,但如果我尝试添加第二个......
我有 2 个视图模型, viewmodel 绑定到 view A 类:INotifyPropertyChanged { 公共 A(){} 私人布尔_propertya; 公共 bool 属性A { 获取{返回_propertya;} 设置{_propertya=值;
如何使用SoapBox将数据从View绑定到UserControl
我有我的 SoapBox.Document '注册' [导出(SoapBox.Core.ExtensionPoints.Workbench.Documents,typeof(IDocument))] [导出(CompositionPoints.Workbench.Documents.Register,typeof(注册))] [文档...
我在设计可扩展程序的架构时遇到了一些问题。 我正在使用 MEF、MMVM Light Toolkit 和 AvalonDock。 第一个问题是如何显示某些 ViewModel 的视图
CollectionViewSource.SortDescriptions 仅适用于基础 ObservableCollection 的第一个第一个群体
我有一个带有 CollectionViewSource 设置如下的网格: 我有一个 Grid,其 CollectionViewSource 设置如下: <UserControl.Resources> <CollectionViewSource x:Key="PriceHistoryItemsViewSource" Source="{Binding PriceHistory}" IsLiveSortingRequested="True"> <CollectionViewSource.SortDescriptions> <componentModel:SortDescription PropertyName="Inserted" Direction="Descending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> </UserControl.Resources> <DataGrid Style="{StaticResource HistoryGrid}" ItemsSource="{Binding Source={StaticResource PriceHistoryItemsViewSource}}"> <DataGrid.Columns> ///... </DataGrid.Columns> </DataGrid> 在 ViewModel 中,PriceHistory 是由 ObservableCollection 更新的 RefreshPriceHistoryAsync,如下所示: public class OptionPriceHistoryViewModel : PriceHistoryViewModel { //... other code public ObservableCollection<OptionPriceHistoryRecordViewModel> PriceHistory { get; } = new(); public override async Task RefreshPriceHistoryAsync(string correlationId) { var priceHistory = await _historyProvider.GetOptionPriceHistoryAsync(id); PriceHistory.Clear(); foreach (var priceHistoryRecord in priceHistory) PriceHistory.Add(new OptionPriceHistoryRecordViewModel( priceHistoryRecord.InsertDate, priceHistoryRecord.Username //... etc. )); } } 此 ViewModel 用作 Window 控件中的 DataContext。 可以重复使用同一窗口来显示各种实体的价格历史记录。 排序仅在第一次填充 PriceHistory 时有效。如果重复使用同一个窗口来显示各种实体的历史记录,则在第一个之后的所有调用中都会忽略排序(即,项目按照它们来自数据库的顺序显示)。 如何在重用窗口时保留排序? 坦率地说,我不明白为什么它不起作用,因为每次重用窗口时,都会创建 OptionPriceHistoryViewModel 的新实例......并且项目的绑定有效,但排序不起作用。 您还需要设置 LiveSortingProperties 属性: <CollectionViewSource x:Key="PriceHistoryItemsViewSource" Source="{Binding PriceHistory}" IsLiveSortingRequested="True"> <CollectionViewSource.SortDescriptions> <componentModel:SortDescription PropertyName="Inserted" Direction="Descending"/> </CollectionViewSource.SortDescriptions> <CollectionViewSource.LiveSortingProperties> <s:String>Inserted</s:String> </CollectionViewSource.LiveSortingProperties> </CollectionViewSource> 这里有一些关于此的链接: 我需要 CollectionViewSource 排序/实时排序说明 https://www.codeproject.com/Questions/326899/CollectionViewSource-not-sorting
我正在使用 MVVM 模式创建一个 WPF 应用程序。 验证错误通过使用 INotifyDataErrorInfo 进行管理。 ViewModel 实现 INotifyDataErrorInfo。 对于 System.Windows.Controls 控制...
将 RoutedEvent 转换为 WPF 中 MVVM 模式的命令
如何将Checkbox.checked路由事件转换为MVVM模式的命令? 参考-考虑按钮单击路由事件,当我们为按钮分配命令时,button.click 事件是
如何更改NavigationView(Lepoco WPFUI)的内容?
最近在做一个项目,涉及到WebSocket的使用。但是,当我收到 MainPageWindow.xaml.cs 上的消息后,我必须更改 FriendPage.xaml 上标签的内容(An U...
如何支持Windows 11“对齐布局”到WPF中的自定义最大化/恢复按钮?
我有一个使用自定义最大化/恢复按钮的 WPF 应用程序。在 Windows 11 中,鼠标悬停在最大化/恢复按钮上不会弹出捕捉布局功能,如下所示: 有谁有任何想法解决这个问题...