wpf 相关问题

Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。

WPF:如何通过行之一单元格中的按钮删除网格中的行?

这是添加一行包含四个元素的代码: private void ItemAdd(对象发送者, RoutedEventArgs e) { 按钮deleteButton = 新按钮{ Visibility = Visibility.Visible, Content = &q...

回答 1 投票 0

带有碰撞检测的WPF动画:如何实现?

我正在尝试创建一个动画,其中汽车在道路上行驶,等待火车通过,然后继续。但是,我无法找到有关如何实现这一点的信息。另外...

回答 1 投票 0

使用 UserControl 作为资源字典

是否可以在另一个用户控件中使用我在中定义的资源,而无需使用资源字典的额外文件。 我有一个用户控件“ViewCostumers&

回答 2 投票 0

如何在 VSIX 项目中使用 WPF 自定义控件/样式库?

我有一个带有自定义向导的 vsix,我想使用 WPF 作为向导,我可以创建一个窗口并显示我的向导,现在我想使用包含在库/nuget 中的 Fluent WPF 样式: https://github...

回答 1 投票 0

WPF:如何从 DatagridHeader 的 ContentTemplate 绑定到字典项

我正在尝试在数据网格标题上使用组合框实现过滤弹出窗口。我正在尝试将弹出窗口内组合框的项目源绑定到相关列的内容。 为了做到这一点,我

回答 1 投票 0

如何在同一单独线程上运行多个 WPF 窗口

有一个众所周知的解决方案可以在单独的线程上运行窗口。然而我的问题是 - 如何在与“主”UI 线程分开的同一个窗口上运行两个或多个窗口? 注意 -

回答 1 投票 0

WPF 我如何获取有关从一个视图模型更改另一个视图模型的信息

我有一个主窗口,其中包含内容控件和两个单选按钮。 主窗口.xaml: 我有一个主窗口,其中包含内容控件和两个单选按钮。 MainWindow.xaml: <Grid> <StackPanel > <RadioButton Content="First" IsChecked="True" Command="{Binding FirstViewCommand}"/> <RadioButton Content="Second" Command="{Binding SecondViewCommand}"/> </StackPanel> <ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding CurrentView}"/> </Grid> 我绑定了我的用户控件到这个内容控件。这里我有组合框列表框和按钮。基于 Cobobox.SelectedElement 我需要在按下按钮后更改 ListBox 中的数据。 用户控制: <Grid> <ComboBox x:Name="BoxOfDetails" ItemsSource="{Binding DetailsScheme}"> </ComboBox> <Button Command="{Binding ProduceCommand}" CommandParameter="{Binding ElementName=BoxOfDetails, Path=SelectedItem}" /> <ListBox x:Name="ListOfMaterials" ItemsSource="{Binding Materials}" > </ListBox> </Grid> 我还有主视图模型,它是主窗口的数据上下文: class MainVM : ObservableObject { public RelayCommand FirstViewCommand { get; set; } public RelayCommand SecondViewCommand { get; set; } public FirstVM FirstViewModel { get; set; } public SecondVM SecondViewModel { get; set; } private object _currentView; public object CurrentView { get { return _currentView; } set => Set(ref _currentView, value); } public MainVM() { FirstViewModel = new FirstVM(); SecondViewModel = new SecondVM(); CurrentView = FirstViewModel; FirstViewCommand = new RelayCommand(o => { CurrentView = FirstViewModel; }); SecondViewCommand = new RelayCommand(o => { CurrentView = SecondViewModel; }); } 和我的用户控件的视图模型: class FirstVM : ObservableObject { private ObservableCollection<DetailScheme> _detailsScheme; private ObservableCollection<Material> _materials; public ObservableCollection<DetailScheme> DetailsScheme { get => _detailsScheme; public ObservableCollection<Material> Materials { get => _materials; set => Set(ref _materials, value); } public RelayCommand ProduceCommand { get; set; } public FirstVM () { _detailsScheme = GetDetailsScheme("D:/ DetailsScheme.json"); _materials = GetMaterials("D:/ Materials.json"); ProduceCommand = new RelayCommand(o => {***}); } 当我的用户控制切换时,我需要在列表框中保存信息(例如,用户在框中选择某些内容并按下按钮,列表框中的数据在切换控件后正在更新,我拥有与启动应用程序时相同的信息) 我添加了将信息保存到我的用户控件视图模型中的文件的方法: public void SaveFirstVM() { SaveDetails(_details, "D:/ Details.json"); SaveMaterials(_materials, "D:/ Materials.json"); } 当我在命令中的主视图模型中切换视图时,我尝试调用它 SecondViewCommand = new RelayCommand(o => { CurrentView = SecondViewModel; FirstViewModel.SaveFirstVM() }); 但没有任何反应,我可以在每次按下用户控件视图模型中的生成按钮后调用此保存方法,但我认为这不是一个好方法。 我在我的项目中添加了一些断点,我只能建议问题是我的 UserControl 视图模型创建了两次,第一次在 MainVM 中,第二次在初始化发生时,当我更改数据时,它发生在初始化对象中,当我尝试从 mainVM 保存数据它保存其他未更改的对象 我使用一个名为 ObservableHandler<T> 的类,它可以让我观看另一个实现 INotifyPropertyChanged 的类并侦听 PropertyChanged 事件。 如果您要使用此功能,您可以监视其他 ViewModel 中的属性发生更改,而不必保存到文件中。 使用方法 public class OtherViewModel { private ObservableHandler<ViewModel> _handler; public OtherViewModel(ViewModel vm) { _handler = new ObservableHandler<ViewModel>(vm) .Add(v => v.Name, OnOtherNameChanged); } private void OnOtherNameChanged(ViewModel vm) { // react to the other property changing } } public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public string Name { get; set; } } ObservableHandler public class ObservableHandler<T> : IWeakEventListener where T : class, INotifyPropertyChanged { private readonly WeakReference<T> _source; private readonly Dictionary<string, Action> _handlers = new(); private readonly Dictionary<string, Action<T>> _handlersT = new(); public ObservableHandler(T source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } _source = new(source); } public ObservableHandler<T> Add(Expression<Func<T, object>> expression, Action handler) { if (handler == null) { throw new ArgumentNullException(nameof(handler)); } var source = GetSource(); if (source == null) { throw new InvalidOperationException("Source has been garbage collected."); } var propertyName = GetPropertyNameFromLambda(expression); _handlers[propertyName] = handler; PropertyChangedEventManager.AddListener(source, this, propertyName); return this; } public ObservableHandler<T> Add(Expression<Func<T, object>> expression, Action<T> handler) { if (handler == null) { throw new ArgumentNullException(nameof(handler)); } var source = GetSource(); if (source == null) { throw new InvalidOperationException("Source has been garbage collected."); } var propertyName = GetPropertyNameFromLambda(expression); _handlersT[propertyName] = handler; PropertyChangedEventManager.AddListener(source, this, propertyName); return this; } public ObservableHandler<T> AddAndInvoke(Expression<Func<T, object>> expression, Action handler) { Add(expression, handler); handler(); return this; } public ObservableHandler<T> AddAndInvoke(Expression<Func<T, object>> expression, Action<T> handler) { Add(expression, handler); handler(GetSource()); return this; } private T GetSource() { if (_source.TryGetTarget(out var source)) return source; throw new InvalidOperationException($"{nameof(source)} has been garbage collected."); } bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) { return OnReceiveWeakEvent(managerType, sender, e); } public virtual bool OnReceiveWeakEvent(Type managerType, object sender, EventArgs e) { if (managerType != typeof(PropertyChangedEventManager)) { return false; } var propertyName = ((PropertyChangedEventArgs)e).PropertyName; Notify(propertyName); return true; } protected void Notify(string propertyName) { var source = GetSource(); if (source == null) { throw new InvalidOperationException("Confused, received a PropertyChanged event from a source that has been garbage collected."); } if (string.IsNullOrEmpty(propertyName)) { foreach (var handler in _handlers.Values) { handler(); } foreach (var handler in _handlersT.Values) { handler(source); } } else { if (_handlers.TryGetValue(propertyName, out var handler)) handler(); if (_handlersT.TryGetValue(propertyName, out var handlerT)) handlerT(source); } } public static string GetPropertyNameFromLambda(Expression<Func<T, object>> expression) { var lambda = expression as LambdaExpression; MemberExpression memberExpression; if (lambda.Body is UnaryExpression unaryExpression) { memberExpression = unaryExpression.Operand as MemberExpression; } else { memberExpression = lambda.Body as MemberExpression; } if (memberExpression == null) throw new ArgumentException("Property name lambda expression needs to be in the form: n = > n.PropertyName"); var propertyInfo = memberExpression.Member as PropertyInfo; if (propertyInfo == null) throw new InvalidOperationException("Bug, memberExpression.Member as PropertyInfo cast failed."); return propertyInfo.Name; } }

回答 1 投票 0

动态解析 MergedDictionaries 中的静态资源

对所有代码感到抱歉,但我觉得我需要它来解释问题。另外,我知道一些问题可以通过使用动态资源来解决,但我也需要它来处理静态资源......

回答 1 投票 0

动态解析 MergedDictionaries 中的静态资源

对所有代码感到抱歉,但我觉得我需要它来解释问题。另外,我知道一些问题可以通过使用动态资源来解决,但我也需要它来处理静态资源......

回答 1 投票 0

具有多个命名的C#类

我在项目中引用了一个外部程序集(dll),并且该程序集有多个版本。 问题是程序集更改了一些类名,并且在使用它们时出现运行时错误。例如...

回答 1 投票 0

WPF 始终位于顶部

即使其他应用程序在全屏上运行,是否可以使窗口始终保持在顶部?我现在正在使用 TopMost = true 但当其他应用程序在全屏上运行时我的

回答 8 投票 0

从生成的 MSIX 包中排除文件夹

我使用 Visual Studio 中的 Windows 应用程序打包项目将 WPF 应用程序打包为 MSIX 包,以便在 Microsoft 商店中分发。 现在,我的应用程序运行得很好。 ...

回答 1 投票 0

Windows WPF XAML 数据绑定转义序列问题

假设我有以下XAML语句: 但我想显示实际的文本{Binding Path=AutoCnt},ins...

回答 1 投票 0

将 WPF 转换为 Web [已关闭]

我的应用程序使用 Infragistics 控件(xaml)内置到 WPF 中。 我想将现有的应用程序移植到 Web 中,但我们不想使用 silverlight(对于 silverlight,我们需要插件可用......

回答 1 投票 0

WPF - 拉伸图像以适合区域

我试图根据图像的形状(蓝色块)来显示以下内容: 我有一些问题: 图像拉伸应限制在其可用区域内,由

回答 1 投票 0

当用户取消关闭时如何保持我的 WPF C# 应用程序运行

我有一个 C# WPF 应用程序,它将作为后台进程运行。要求是,它必须在后台持续运行。但在以下情况下会失败: 用户点击关闭但由于某些原因

回答 1 投票 0

如何更有效地填充用户详细信息集合

我有一个 Module 类、一个 User、一个 UserModule 和一个 UserModuleLevel 类。 _module_objects 是模块的静态 ObservableCollection,在程序启动时创建,大约有 10 个...

回答 1 投票 0

WPF 中用于可见性绑定的 IValueConverter 永远不会被调用

我想将 WPF 中控件的可见性属性绑定到布尔值。 我写了一个基于IValueConverter的转换器: 命名空间 MyApp.Converter { 使用系统; 使用 System.Windows.D...

回答 1 投票 0

未定义父级大小时,网格宽度“*”的行为不符合预期

我在对话框中有一组控件想要自动调整大小。一切工作正常,直到我尝试使用均匀间隔的网格宽度重新排列事物。 这是 XAML: 我在对话框中有一组控件想要自动调整大小。一切工作正常,直到我尝试使用均匀间隔的网格宽度重新排列事物。 这是 XAML: <Grid Margin="20" > <Grid.RowDefinitions> <RowDefinition Height="AUTO" /> <RowDefinition Height="AUTO" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid> ...left controls </Grid> <Border BorderThickness="1" BorderBrush="Gray" Grid.Column="1" Margin="0,10,0,5"> ...right controls </Border> <Grid Grid.Row="2" Grid.ColumnSpan="2> ...okay and cancel </Grid> </Grid> 结果如下: 不是我所期待的。右列的宽度很小,由于某种原因,它没有监听“*”并使其等于另一列的一半。 如果我将 Width="450" 放在最高的网格或 UserControl 上(或者在运行时,调整它所在的窗口大小!),所有内容都会“跳跃”,我会得到我所期望的,两列均匀间隔: 但现在它不响应重新调整大小或自动调整较大内容的大小(除非父容器拉伸时不会拉伸)如果我在等间距后我可以使用共享大小组。我做错了什么吗?或者这是 Width="*" 的预期行为吗? 当您的外部网格托管在未定义宽度的容器中时,实际宽度将是后代的结果。也就是说,(外部)网格测量通道将“询问”右列(边框):“我正在给您任何您想要的空间:您需要多少?”。只要边框片段不需要任何特定大小,结果就是默认值(在大多数情况下为零)。因此出现了崩溃的行为。 基本上,您应该定义外部网格宽度或第二列宽度(意味着列内的任何内容都应该告诉它需要多少空间)。 你是对的*意思是取与网格成正比的大小。发生这种情况是因为您最高的Grid没有足够的空间变宽(当您设置Width="450"时,Grid会变宽)。 如果你的Window内只有一个网格,那么theSecondColumn将占据右侧的所有位置(它会根据你的需要更宽): <Window x:Class="DataGridAddedColumns.MainWindow" <!-- The code is omitted for the brevity --> Title="MainWindow" Height="550" Width="525" WindowStartupLocation="CenterScreen"> <Grid Name="grid"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*"/> <ColumnDefinition Name="theSecondColumn" Width="*"/> </Grid.ColumnDefinitions> <Grid> </Window> 我发现Border有一个问题,当它的大小应该与具有*列/行的网格单元相匹配时。 有问题的例子: <Grid> ... <Border Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> ... </Border> </Grid> 解决方案:将边框放在辅助网格内,因为对于网格内的网格,单元格对齐效果很好。然后将 Border 的宽度和高度绑定到 Grid 的 ActualHeight / ActualWidth。 <Grid> ... <Grid x:Name="borderGrid" Grid.Row="1" Grid.Column="1"> <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="{Binding ActualHeight, ElementName=borderGrid}" Width="{Binding ActualWidth, ElementName=borderGrid}"> ... </Border> </Grid> </Grid> 因此,即使更改根网格的大小,边框也会正确适合其目标单元格。 (在使用 ColumnSpan 和 RowSpan 时也适用。)

wpf
回答 3 投票 0

在网格中的多个 WPF 用户控件之间进行通信(MVVM 应用程序)

嗨,我想通过在 UserControls 中拥有离散的功能单元来扩展我的应用程序,然后将其中的几个放在我的主页上的 ContentControls 网格中。我需要成为...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.